6

私が取り組んでいるプロジェクトの 1 つで、Test::Unit と組み合わせて Shoulda を使用しています。私が直面している問題は、最近これを変更したことです。

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

4 に答える 4

7

このようなものはどうですか?(の場合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) }
于 2016-07-13T11:52:10.457 に答える
2

私はtsdbrownが提案したのと同様の解決策を試しました。このタイプのテストは、次の場合に合格します。

validates_presence_of :attr_two

しかし、モデルを次のように変更すると、テストは失敗します。

validates_presence_of :attr_two, :on => :save

:attr_twoエラーが["空白にすることはできません"]ではなく[]であるため、失敗します。

于 2011-01-28T00:12:08.863 に答える
2

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
于 2013-02-21T14:43:32.183 に答える
2

その過去に、私はこの問題を回避するために小さなカスタム should ブロックを使用しました。

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 検証オプションを許可することで、shoulda が改善し続けることを願っています。乾杯、あなたの考えを教えてください。

于 2010-01-06T10:38:42.517 に答える