我无法理解 MiniTest 中
assert_predicate
的用处。它与 assert_equal?
有什么不同?何时需要使用此断言?我见过很多次,但并没有真正理解它的确切含义。
assert_equal
检查预期值和实际值是否相等:
assert_equal "Bender", robot.name
assert_predicate
在目标对象上调用命名方法,如果结果为真则通过:
assert_predicate robot, :bender?
您可以轻松地编写此测试:
assert robot.bender?
但是
assert_predicate
在某些情况下可以更具表现力,并且在检查多个谓词条件时可以更好一点:
roles = %i(admin? publisher? operator?)
roles.each {|role| assert_predicate user, role }
该方法的文档本身可能会回答您的问题:
用于使用谓词进行测试。例如:
assert_predicate str, :empty?
这实际上是针对规范的,并且由assert_operator 前端:
str.must_be :empty?
这表明原因是支持
.must_be
电话,而不是提供任何超过 assert_equal
或 assert
的具体好处。
assert_predicate
在引擎盖下使用 assert
。assert_equal
不应使用。assert_predicate
assert_predicate
,顾名思义,用于测试谓词方法(返回 true
或 false
的方法)。
def test_assert_predicate
assert_predicate invoice, :paid?
end
assert_equal
使用
assert_equal
测试谓词方法毫无意义,因为,你要么测试 true
(assert_predicate
) 或 false
(refute_predicate
)。预计没有其他值。
# Bad example!
def test_assert_equal
assert_equal true, invoice.paid?
end
assert
从技术上讲,
assert
和assert_predicate
做同样的事情。此外,后者在底层使用了
assert
,所以你总是可以用一个替换另一个。
def test_assert
assert invoice.paid?
end
但是,当测试失败并显示错误消息时,差异就变得至关重要:
assert
失败并显示神秘的Expected false to be truthy.
消息,而assert_predicate
打印Expected Invoice #1234 to be paid?
。