rails + rspec: оставаясь сухим при тестировании валидаций - PullRequest
4 голосов
/ 18 марта 2010

Хорошо, скажите, что у меня есть следующая модель:

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

Я делаю юнит-тесты rspec для этих проверок. Они выглядят так:

  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

Это выглядит не совсем сухо. Есть ли какой-нибудь драгоценный камень или плагин, который автоматизирует такие вещи? Я хотел бы получить что-то вроде этого:

  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

Ответы [ 3 ]

9 голосов
/ 18 марта 2010

Есть замечательные для этого: http://github.com/carlosbrando/remarkable

После того, как вы можете сделать

it { should validate_presence_of :name }
5 голосов
/ 24 июня 2012

Если вы используете factory_girl , вы можете сделать:

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

Одно предложение ... не используйте ключевое слово "must" в каждой спецификации. Вместо этого напишите: «недопустимо без имени»

0 голосов
/ 11 сентября 2012

Попробуйте также accept_values_for gem. Это позволяет сделать что-то вроде этого:

describe User do

  subject { User.new(@valid_attributes)}

  it { should accept_values_for(:email, "john@example.com", "lambda@gusiev.com") }
  it { should_not accept_values_for(:email, "invalid", nil, "a@b", "john@.com") }
end
...