Shoulda: Test проверяет наличие:on =>: update


Я использую Shoulda в сочетании с Test:: Unit на одном из проектов, над которыми я работаю. Проблема, с которой я сталкиваюсь, заключается в том, что я недавно изменил это:

class MyModel < ActiveRecord::Base
  validates_presence_of :attribute_one, :attribute_two
end

К этому:

class MyModel < ActiveRecord::Base
  validates_presence_of :attribute_one
  validates_presence_of :attribute_two, :on => :update
end

Раньше мои (проходные) тесты выглядели так:

class MyModelTest < ActiveSupport::TestCase
  should_validate_presence_of :attribute_one, :attribute_two
end
Насколько я могу судить, нет никакого параметра к should_validate_presence_of, который заставит этот тест продолжать проходить с изменениями, указанными выше. Кроме отказа от Shoulda при тестировании требования :attribute_two, Есть ли какой-либо способ обойти вот это?
4 5

4 ответа:

В прошлом я просто использовал небольшой пользовательский блок, чтобы обойти эту проблему:

should "require :attr_two on update" do
  mm = Factory(:my_model)
  mm.attr_two = nil
  mm.save
  assert_equal false, mm.valid?
  assert_equal("can't be blank", mm.errors.on(:attr_two))
 end

Надеюсь, что shoulda будет продолжать совершенствоваться, позволяя дальнейшие варианты проверки AR в будущем. Дайте мне знать, что вы думаете, ваше здоровье.

А как насчет чего-то вроде этого? (для shoulda-matchers-3.1.1)

subject { FactoryGirl.build(:your_model) }
it { is_expected.to validate_presence_of(:attribute_one) }
it { is_expected.to validate_presence_of(:attribute_two).on(:update) }

В Rspec вы можете сделать следующее:

describe MyModelTest do
  describe "validations" do
    should_validate_presence_of :attribute_one

    context "on update" do
      subject { FactoryGirl.create(:my_model_test) }

      should_validate_presence_of :attribute_two
    end
  end
end

Я попробовал решение, подобное тому, что предложил tsdbrown. Этот тип теста проходит, когда у меня есть:

validates_presence_of :attr_two

Но тест не пройдет, если я изменю модель на:

validates_presence_of :attr_two, :on => :save

Это не удается, потому что: attr_two ошибка [] вместо ["не может быть пустым"]