Следует: проверить validates_presence_of: on =>: обновить - PullRequest
5 голосов
/ 06 января 2010

Я использую Needa в сочетании с 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 нет параметра, который заставил бы этот тест продолжить проходить с изменениями, указанными выше. Если не считать того, что нужно проверять требование :attribute_two, есть ли способ обойти это?

Ответы [ 4 ]

4 голосов
/ 13 июля 2016

Как насчет этого? (для 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) }
2 голосов
/ 28 января 2011

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

validates_presence_of :attr_two

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

validates_presence_of :attr_two, :on => :save

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

2 голосов
/ 21 февраля 2013

В 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
2 голосов
/ 06 января 2010

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

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

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

...