开发者

How to write rspec for blank field? [Rails3.1]

开发者 https://www.devze.com 2023-04-11 18:46 出处:网络
I use rails 3.1 + rspec and factory girl. My validation of required field (validates_presence_of) is working.

I use rails 3.1 + rspec and factory girl.

My validation of required field (validates_presence_of) is working. How do I get the test to use that fact as a 'success' rather than a 'failure'

The spec is:

describe "Add an industry with no name" do
  context "Unable to create a record when the name is blank" do
    subject do
      ind = Factory.create(:industry_name_blank)
    end
    it { should be_invalid }
  end
end

but I get a failure:

Failures:

  1) Add an industry with no name Unable to create a record when the name is blank 
     Failure/Error: ind = Factory.create(:industry_name_blank)
     ActiveRecord::RecordInvalid:
       Validation failed: Name can't be blank
     # ./s开发者_StackOverflowpec/models/industry_spec.rb:45:in `block (3 levels) in <top (required)>'
     # ./spec/models/industry_spec.rb:47:in `block (3 levels) in <top (required)>'

Finished in 0.20855 seconds
8 examples, 1 failure

Model Code:

class Industry < ActiveRecord::Base
  validates_presence_of :name
  validates_uniqueness_of :name
end

Factory Code:

Factory.define :industry_name_blank, :class => 'industry' do |industry|
  industry.name   { nil }
end


Here's an example... subject gets populated with "Industry.new" by convention

describe Industry do

  it "should have an error on name when blank" do
    subject.name.should be_blank
    subject.valid?
    subject.should have(1).error_on(:name)
    #subject.errors.on(:name).should == "is required"
  end

end

The last is a little more brittle, but you could do it

More on the syntax: http://cheat.errtheblog.com/s/rspec/


Factory.build(:industry_name_blank) generates the object while Factory.create(:industry_name_blank) generates and saves the created object. In your case it can't save the object, because it is invalid due to lacking name, which is why you get the validation error.

So instead of using create use build to avoid hitting the validation errors: Factory.build(:industry_name_blank). Then you should be able to spec it out like Jesse suggests:

subject.should_not be_valid
subject.should have(1).error_on(:name)
0

精彩评论

暂无评论...
验证码 换一张
取 消