Rspec Rails Test Error :Failure/Error: JSON.parse(response.body) && JSON::ParserError: 784: unexpected token at ' '
Rspec Rails Test Error :Failure/Error: JSON.parse(response.body) && JSON::ParserError: 784: unexpected token at ' '
晚上好:
所以我对 rails 中的测试世界是全新的。我一直在关注 API's & Authentication 教程以尝试学习测试:
Scotch.io - build-a-restful-json-api-with-rails-5
现在本教程适用于 Rails 5(我正在使用 rails 6 - 可能与问题有关?)
所以发生的事情是当我 运行 rails exec rspec
测试 运行 正常直到我达到我的 clients_spec.rb
// 客户端控制器规范的这个块 POST 测试(如下所示):
describe 'Post /loadze_app/api/v1/clients' do
let(:valid_attributes) { { client_name: 'Mega Client', street_address: '221 some address rd' } }
context 'when the request is valid' do
before { post '/loadze_app/api/v1/clients', params: valid_attributes }
it 'creates a client' do
expect(json['client_name']).to eq('Mega Client')
end
it 'returns status code 201' do
expect(response).to have_http_status(201)
end
end
context 'when the request is invalid' do
before { post '/loadze_app/api/v1/clients', params: { street_address: 'Foobar' } }
it 'returns status code 422' do
expect(response).to have_http_status(422)
end
it 'returns a validation failure message' do
expect(response.body).to match(/Validation failed: Client name can't be blank/)
end
end
end
当我删除此块并再次 运行 测试时,一切正常。所以我有点不知所措,并努力在 Stack 和其他资源站点上找到任何相关修复程序。
这是我在 运行 rails exec rspec
:
时得到的错误
1) Clients API Post /loadze_app/api/v1/clients when the request is valid creates a client
Failure/Error: JSON.parse(response.body)
JSON::ParserError:
784: unexpected token at ''
# ./spec/support/request_spec_helper.rb:3:in `json'
# ./spec/requests/clients_spec.rb:47:in `block (4 levels) in <main>'
# ./spec/rails_helper.rb:42:in `block (3 levels) in <top (required)>'
# ./spec/rails_helper.rb:41:in `block (2 levels) in <top (required)>'
以下是错误引用的所有文件:我已使用 ** 行 # **
表示该行
/spec/support/request_spec_helper.rb:3
module RequestSpecHelper
def json
JSON.parse(response.body) ** Line 3
end
end
/spec/requests/clients_spec.rb:47
describe 'Post /loadze_app/api/v1/clients' do
let(:valid_attributes) { { client_name: 'Mega Client', street_address: '421 Rundleson Pl N.E' } }
context 'when the request is valid' do
before { post '/loadze_app/api/v1/clients', params: valid_attributes }
it 'creates a client' do
expect(json['client_name']).to eq('Mega Client') **Line 47**
end
it 'returns status code 201' do
expect(response).to have_http_status(201)
end
end
context 'when the request is invalid' do
before { post '/loadze_app/api/v1/clients', params: { street_address: 'Foobar' } }
it 'returns status code 422' do
expect(response).to have_http_status(422)
end
it 'returns a validation failure message' do
expect(response.body).to match(/Validation failed: Client name can't be blank/)
end
end
end
/spec/rails_helper.rb:41/42
require 'database_cleaner'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# Add additional requires below this line
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
config.include FactoryBot::Syntax::Methods
config.include RequestSpecHelper, type: :request
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
DatabaseCleaner.strategy = :transaction
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do **Line 41**
example.run ** Line 42**
end
end
end
非常感谢任何对此问题的帮助!如果需要更多信息,请告诉我!提前致谢!
可能需要更多关于客户正在做什么的上下文,但请尝试:
before { post '/loadze_app/api/v1/clients', params: valid_attributes.to_json, as: :json }
晚上好:
所以我对 rails 中的测试世界是全新的。我一直在关注 API's & Authentication 教程以尝试学习测试:
Scotch.io - build-a-restful-json-api-with-rails-5
现在本教程适用于 Rails 5(我正在使用 rails 6 - 可能与问题有关?)
所以发生的事情是当我 运行 rails exec rspec
测试 运行 正常直到我达到我的 clients_spec.rb
// 客户端控制器规范的这个块 POST 测试(如下所示):
describe 'Post /loadze_app/api/v1/clients' do
let(:valid_attributes) { { client_name: 'Mega Client', street_address: '221 some address rd' } }
context 'when the request is valid' do
before { post '/loadze_app/api/v1/clients', params: valid_attributes }
it 'creates a client' do
expect(json['client_name']).to eq('Mega Client')
end
it 'returns status code 201' do
expect(response).to have_http_status(201)
end
end
context 'when the request is invalid' do
before { post '/loadze_app/api/v1/clients', params: { street_address: 'Foobar' } }
it 'returns status code 422' do
expect(response).to have_http_status(422)
end
it 'returns a validation failure message' do
expect(response.body).to match(/Validation failed: Client name can't be blank/)
end
end
end
当我删除此块并再次 运行 测试时,一切正常。所以我有点不知所措,并努力在 Stack 和其他资源站点上找到任何相关修复程序。
这是我在 运行 rails exec rspec
:
1) Clients API Post /loadze_app/api/v1/clients when the request is valid creates a client
Failure/Error: JSON.parse(response.body)
JSON::ParserError:
784: unexpected token at ''
# ./spec/support/request_spec_helper.rb:3:in `json'
# ./spec/requests/clients_spec.rb:47:in `block (4 levels) in <main>'
# ./spec/rails_helper.rb:42:in `block (3 levels) in <top (required)>'
# ./spec/rails_helper.rb:41:in `block (2 levels) in <top (required)>'
以下是错误引用的所有文件:我已使用 ** 行 # **
表示该行/spec/support/request_spec_helper.rb:3
module RequestSpecHelper
def json
JSON.parse(response.body) ** Line 3
end
end
/spec/requests/clients_spec.rb:47
describe 'Post /loadze_app/api/v1/clients' do
let(:valid_attributes) { { client_name: 'Mega Client', street_address: '421 Rundleson Pl N.E' } }
context 'when the request is valid' do
before { post '/loadze_app/api/v1/clients', params: valid_attributes }
it 'creates a client' do
expect(json['client_name']).to eq('Mega Client') **Line 47**
end
it 'returns status code 201' do
expect(response).to have_http_status(201)
end
end
context 'when the request is invalid' do
before { post '/loadze_app/api/v1/clients', params: { street_address: 'Foobar' } }
it 'returns status code 422' do
expect(response).to have_http_status(422)
end
it 'returns a validation failure message' do
expect(response.body).to match(/Validation failed: Client name can't be blank/)
end
end
end
/spec/rails_helper.rb:41/42
require 'database_cleaner'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# Add additional requires below this line
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
config.include FactoryBot::Syntax::Methods
config.include RequestSpecHelper, type: :request
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
DatabaseCleaner.strategy = :transaction
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do **Line 41**
example.run ** Line 42**
end
end
end
非常感谢任何对此问题的帮助!如果需要更多信息,请告诉我!提前致谢!
可能需要更多关于客户正在做什么的上下文,但请尝试:
before { post '/loadze_app/api/v1/clients', params: valid_attributes.to_json, as: :json }