为什么 Minitest 似乎并不总是报告测试的 'Actual' 结果是什么?

Why does Minitest seem to not always report what the 'Actual' results of the test are?

为什么 MiniTest 有时会真正显示 'Actual' 而有时只会显示 nil/blank/quote。

示例 - 我知道 a.join 的值有 "Hi" 显示在 2 行和一个空行上。

class Question

  def stack
    "Hi\n" \
    "Hi\n"  
  end

  def overflow
    a = []
    a << stack + "\n"   # This + "\n" is in question
    a.join              # This is "hi"s
  end
end

a = Question.new
puts a.overflow

如果我取出 + "\n",测试会说 "Actual" 只是一个引号,而不是它的实际含义("Hi" 打印在 2 行上)。如果我将 'a.join' 替换为 "Tadah!",那么 Minitest 将在 "Actual" 下显示 "Tadah!"。

我有以下测试:

def test_verses
  expected = "Hi\n" \
  "Hi\n\n"
  assert_equal expected, Question.new.overflow
end

这种情况我见过好几次了。我永远不知道我是否真的没有结果,或者 Minitest 是否由于某种原因再次对我来说 "lying"。

一如既往的感谢!

Minitest 的输出是预期结果和实际结果的 diff(我认为它实际上调用了外部 diff 命令)。没有单独的“预期”和“实际”部分,它们以显示差异的格式混合在一起。

在这种情况下,当您删除 `"\n" 时,失败如下所示:

  1) Failure:
Foo#test_verses [foo.rb:22]:
--- expected
+++ actual
@@ -1,4 +1,3 @@
 "Hi
 Hi
-
 "

--- expected+++ actual 表示在差异中(显示在 @@... 行之后)以 - 开头的行预计会出现但没有出现't,以及以 + 开头的行出现在结果中但不应该出现。在此示例中,有一个以 - 开头的空行。这意味着换行符预计会出现在输出中,但实际上并没有。这对应于您删除的 + "\n",但测试符合预期。 - 行之后的引号是整个差异的结束引号,而不是“预期”部分的内容。

当您将 overflow 方法的 return 值更改为 "Tadah!" 时,失败消息如下所示:

  1) Failure:
Foo#test_verses [foo.rb:23]:
--- expected
+++ actual
@@ -1,4 +1 @@
-"Hi
-Hi
-
-"
+"Tadah!"

查看以 - 开头的行,您可以看到整个预期的消息都丢失了,而以 + 开头的行显示有一个包含 Tadah! 的额外行。这种情况的不同之处还在于 Minitest 将输出显示为两个单独的字符串(注意两组单独的引号)。