MiniTest中assert_predicate有什么用?

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

我无法理解 MiniTest 中

assert_predicate
的用处。它与
assert_equal?
有什么不同?何时需要使用此断言?我见过很多次,但并没有真正理解它的确切含义。

ruby minitest
3个回答
17
投票

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 }

4
投票

该方法的文档本身可能会回答您的问题:

用于使用谓词进行测试。例如:

assert_predicate str, :empty?

这实际上是针对规范的,并且由assert_operator 前端:

str.must_be :empty?

这表明原因是支持

.must_be
电话,而不是提供任何超过
assert_equal
assert
的具体好处。


0
投票

简述

  • 归结为错误消息。
  • 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?

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