Good evening:
So I am BRAND NEW to the world of testing in rails. I have been following this tutorial on API's & Authentication to try to learn testing:
Scotch.io - build-a-restful-json-api-with-rails-5
Now this tutorial is for Rails 5 (I am using rails 6 - may have something to do with the problem?)
so whats happening is when I run rails exec rspec
the tests run fine until I hit this block of my clients_spec.rb
// clients controller spec POST tests (shown below):
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
When I remove this block and run the test again it all works as it should. So I am at a bit of a loss and struggling to find any relevant fixes on Stack and other resource sites.
this is the error I get when I run 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)>'
Here are all the files the error is referencing: I have denoted the line by using ** Line # **
/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
Any assistance with this problem would be GREATLY appreciated! Please let me know if any more information is required! Thanks in advance!
Might need some more context of what the client is doing, but try:
before { post '/loadze_app/api/v1/clients', params: valid_attributes.to_json, as: :json }