Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails + rspec : Staying DRY when testing validations

Ok say I have the following model:

class Country < ActiveRecord::Base
  validates_presence_of :name
  validates_presence_of :code
end

I'm doing the rspec unit tests for those validations. They look like this:

  it "should be invalid without a name" do
    country = Country.new(@valid_attributes.except(:name))
    country.should_not be_valid
    country.errors.on(:name).should == "can't be blank"
    country.name = @valid_attributes[:name]
    country.should be_valid
  end

  it "should be invalid without a code" do
    country = Country.new(@valid_attributes.except(:code))
    country.should_not be_valid
    country.errors.on(:code).should == "can't be blank"
    country.code = @valid_attributes[:code]
    country.should be_valid
  end

This doesn't look quite DRY. Is there any gem or plugin that automates this kind of stuff? I'd like to get something along these lines:

  it "should be invalid without a name" do
    test_presence_validation :name
  end

  it "should be invalid without a code" do
    test_presence_validation :code
  end
like image 918
kikito Avatar asked Dec 09 '22 16:12

kikito


2 Answers

There are remarkable for that : http://github.com/carlosbrando/remarkable

After you can do

it { should validate_presence_of :name }
like image 163
shingara Avatar answered Dec 31 '22 06:12

shingara


If you're using factory_girl, you can do:

  it "should be invalid without a name" do
    FactoryGirl.build(:country, name: nil).should_not be_valid
  end

One suggestion... don't use the keyword "should" on every spec. Instead, write: "is invalid without a name"

like image 21
Mich Dart Avatar answered Dec 31 '22 07:12

Mich Dart