确定 assert_not 子句在 Rails 4 测试中通过了什么错误?

Determine what error assert_not clause passes with in a Rails 4 test?

我测试我的对象是否使用 assert_not 验证失败,所以它实际上通过了失败的验证。但是,我想知道它具体在哪些验证上失败了。

本质上,我如何确保我的对象至少在我的情况下失败 validates_acceptance_of :terms

class StaffTest < ActiveSupport::TestCase
  context "Save staff and validate" do
    setup do
      @staff = Fabricate.build(:staff)
      @new_staff = Staff.new
    end

    teardown do 
      @staff = nil
      @new_staff = nil
    end

    should "fail if save without accepting terms" do
      @staff.validate_terms = true
      assert_not @staff.valid?, @staff.errors.full_messages.inspect
    end
  end
end

据推测,我希望我的测试通过,因为它没有通过密码验证。然而,实际上,它确实通过了,但它通过了,因为它在条款验收验证方面失败了。在这种情况下,我的测试没有达到目的。因此,我想确保测试通过正确的失败。

我正在使用 Rails 4、Shoulda 和 ActiveSupport::TestCase(Minitest)

@staff.errors.messages 将包含每个错误字段名称和相应消息的散列。您可以将其用于此目的。

assert !@staff.save
assert @staff.errors.messages.values.include?("msg must be there")