如何扩展 Ruby Test::Unit 断言以包含assert_false?

问题描述 投票:0回答:5

显然 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
5个回答
10
投票

如果您使用 MiniTest(在 Ruby 1.9+ 中替换 Test::Unit),那么您可以使用

refute
方法,这是
assert
的逆方法。


5
投票

我个人认为

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
的直接比较。


4
投票

Rails 4 有

assert_not
可以满足您的需求。

test "requires valid url" do
  @mymodel.url = "bogus!"
  assert_not @mymodel.valid?
end

3
投票

只需在您所声明的内容前面添加一个感叹号即可:

assert !(something_false)

0
投票

唯一检查假值的正确方法是使用assert_equal(val, false)

,因为当 val = nil 时,
refute(val)
assert_not(val)
assert(!val)
等方法都会返回
true
,而不是
false
 正如您所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.