代码之家  ›  专栏  ›  技术社区  ›  jerhinesmith

shoulda:测试验证存在于:on=>:更新

  •  5
  • jerhinesmith  · 技术社区  · 16 年前

    我正在将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 这将导致此测试继续通过上面指定的更改。在测试 :attribute_two 有什么办法可以解决这个问题吗?

    4 回复  |  直到 7 年前
        1
  •  2
  •   tsdbrown    16 年前

    在过去,我只是用一个小的自定义块来解决这个问题:

    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
    

    希望将来能够通过允许更多的应收账款确认选项来继续改进。让我知道你的想法,干杯。

        2
  •  3
  •   jonnyjava.net    9 年前

    像这样的东西怎么样?(用于 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) }
    
        3
  •  2
  •   Yury Kaspiarovich    12 年前

    在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
    
        4
  •  2
  •   Sebastián Palma    7 年前

    我尝试过一种类似于tsdbrown建议的解决方案。当我有以下情况时,这种类型的测试通过:

    validates_presence_of :attr_two
    

    但如果我将模型改为:

    validates_presence_of :attr_two, :on => :save
    

    它失败,因为:attr_two错误是[]而不是[“can't be blank”]