Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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
     # ./spec/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
like image 237
Michael Durrant Avatar asked Oct 10 '11 12:10

Michael Durrant


People also ask

How do I declare a variable in RSpec?

Another way to define a variable in RSpec is to use the let syntax. The let method should be called inside an example group. The first argument is the name of a variable to define.

What RSpec method is used to create an example?

The describe Keyword The word describe is an RSpec keyword. It is used to define an “Example Group”. You can think of an “Example Group” as a collection of tests. The describe keyword can take a class name and/or string argument.

How do I run a specific test in RSpec?

To run a single Rspec test file, you can do: rspec spec/models/your_spec. rb to run the tests in the your_spec. rb file.


2 Answers

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/

like image 66
Jesse Wolgamott Avatar answered Oct 02 '22 03:10

Jesse Wolgamott


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)
like image 37
Jakob S Avatar answered Oct 02 '22 05:10

Jakob S