When I run ‘rspec spec/models’ everything runs beautifully.
When I run ‘rspec spec/controllers’ everything also runs beautifully.
When I run ‘rspec spec’ the models seem to forget that the records
need to pass the validations before being saved to the database.
This is consistent across all model tests which are checking
validations.
Model:
validates_presence_of :name, :location, :email…
Test:
it “should ensure that name is present” do
Factory.build(:public_agent, :name => nil).should
have(1).error_on(:name)
end
All of these tests do not return errors and do add the invalid records
to the database.
All of these tests do not return errors and do add the invalid records
to the database.
Has anyone else had this happen? Suggestions?
Though I’m still using RSpec 1, I do use FactoryGirl. Factory.build only
instantiates a new record; it does not save it. Thus, the example that
you
shared should not create a record. Are you sure that the invalid records
that you’re seeing in the database are from this example?
it “should ensure that name is present” do
Factory.build(:public_agent, :name => nil).should have(1).error_on(:name)
Factory.build ^^ doesn’t even save records to the database in the first
place, so it would be surprising if this were the example that is
causing trouble.
Do you have any other specs besides models and controllers? helpers,
mailers, requests, etc? I’ve seen cases in which data was set up in
before(:all) (which does not run in a transaction and is therefore not
rolled back), and uniqueness validations would fail in other places.
Here’s the error I’m seeing when running all specs (.build
and .create):
Agent while creating should ensure that name is present
Failure/Error: Factory(:public_agent, :name => nil).should
have(1).error_on(:name)
expected 1 error on :name, got 0
# ./spec/models/agent_spec.rb:35:in `block (3 levels) in <top
(required)>’
Here’s what I’m seeing when running model specs with .create:
Agent while creating should ensure that name is present
Failure/Error: Factory(:public_agent, :name => nil).should
have(1).error_on(:name)
ActiveRecord::RecordInvalid:
Validation failed: Name can’t be blank
# ./spec/models/agent_spec.rb:35:in `block (3 levels) in <top
(required)>’
Everything passes when running model specs with .build.
As it turned out the culprit was
“.any_instance.stubs(:valid?).returns(false)” which was being run in
the controllers.
I changed some things around any now everything is working as
expected.
I should also note that if I replace “.should have(1).error_on(:name)”
with, simply, “.should be_valid”. The same issues occur. All specs
(except when only running models) pass when they shouldn’t be.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.