【问题标题】:How to extend Ruby Test::Unit assertions to include assert_false?如何扩展 Ruby Test::Unit 断言以包含 assert_false?
【发布时间】:2011-11-24 17:33:23
【问题描述】:
显然在 Test::Unit 中没有 assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb 来添加它?
这是最好的方法吗?我不想修改test/unit/assertions.rb。
顺便说一句,我不认为这是多余的。我正在使用assert_equal false, something_to_evaluate。这种方法的问题是很容易误用assert false, something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。
【问题讨论】:
标签:
ruby-on-rails
ruby
ruby-on-rails-3
unit-testing
assertions
【解决方案1】:
如果您使用 MiniTest(在 Ruby 1.9+ 中替换了 Test::Unit),那么您可以使用 refute 方法,它是 assert 的逆方法。
【解决方案2】:
我个人认为assert_false 比refute 更好,因为它与所有其他断言一致,而且通常也更符合语义(类似于使用if !condition 而不是unless)。
如果你也有同感并想要assert_false,请添加到test/test_helper.rb:
class ActiveSupport::TestCase
...
def assert_false(test, message="Expected: false. Actual: #{test}.")
assert_equal false, test, message
end
end
编辑:请注意,如果 test 为 nil,assert !test(在其他地方建议)将不起作用(!nil 为真,我们可能希望 assert_false(nil) 失败)。所以这是与false 的直接比较。
【解决方案3】:
Rails 4 有 assert_not 可以满足您的需求。
test "requires valid url" do
@mymodel.url = "bogus!"
assert_not @mymodel.valid?
end
【解决方案4】:
只需在您要断言的内容前添加一个 bang:
assert !(something_false)