显然 Test::Unit 中没有
assert_false
。如何通过扩展断言并添加文件config/initializers/assertions_helper.rb
来添加它?
这是最好的方法吗?我不想修改
test/unit/assertions.rb
。
顺便说一句,我不认为这是多余的。我正在使用
assert_equal false, something_to_evaluate
。这种方法的问题是很容易误用assert false, something_to_evaluate
。这总是会失败,不会抛出错误或警告,并且会在测试中引入错误。
如果您使用 MiniTest(在 Ruby 1.9+ 中替换 Test::Unit),那么您可以使用
refute
方法,这是 assert
的逆方法。
我个人认为
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
编辑:请注意,如果
assert !test
为零(!nil 为 true,我们可能希望 test
失败),则 assert_false(nil)
(在其他地方建议)将不起作用。所以这是与 false
的直接比较。
Rails 4 有
assert_not
可以满足您的需求。
test "requires valid url" do
@mymodel.url = "bogus!"
assert_not @mymodel.valid?
end
只需在您所声明的内容前面添加一个感叹号即可:
assert !(something_false)
唯一检查假值的正确方法是使用assert_equal(val, false)
,因为当 val = nil 时,
refute(val)
、
assert_not(val)
或
assert(!val)
等方法都会返回
true
,而不是
false
正如您所期望的。