Minitest断言未通过检查

时间:2015-02-24 13:53:21

标签: ruby ubuntu minitest

每当我尝试assert_equal两个对象时,我总会得到这样的错误:

   No visible difference in the User#inspect output.
   You should look at the implementation of #== on User or its members.

时间和数组也是如此。 最小的文档也没有真正说明这一点。

我正在使用Ruby 2.0.0,但我使用的是2.2.0,同样的事情发生了。使用最新的minitest。

另外,我正在运行Ubuntu 14.10。

4 个答案:

答案 0 :(得分:7)

关于消息

当断言失败时,会显示此消息,这有点不是错误,但MiniTest无法找到对象之间的差异。

Check out this method

diff在两个对象上运行#inspect并在其上运行diff工具。如果没有差异,则会显示此消息。

原则上,您需要两个在检查时不等于具有不同输出的对象。虽然这并不是一成不变的,但红宝石标准库中的某些类不会像Time那样完全填充此属性。谈到自己的课程,也许您已经编写了自定义#inspect方法?

关于Time,检查只显示秒,而不是分数,但是等于查看分数,因此两个时间对象可能不相等,但在检查时看起来仍然相同。

关于Array,如果其中包含的对象可能不相等但在检查时看起来相同,则会导致显示该消息。

即使检查输出不同,如果您收到此消息,则diff工具出现问题。 MiniTest试图做一些有关使用哪种diff工具的有根据的猜测。您可以通过打印MiniTest::Assertions.diff来检查所选的差异工具。

关于对象相等

如果真正的问题是您的对象在您期望它们时是不相等的,那么您应该看看如何在各个类中定义==方法。默认实现会查看实例化时为每个对象提供的对象ID,这可能不是您想要的,例如处理表示数据库行的对象。

答案 1 :(得分:1)

也许是2个对象'编码实例是不同的。使用encodingforce_encoding检查:

puts obj1.encoding
puts obj2.encoding

以下是一个例子:

ISO-8859-1
ASCII-8BIT

在这种情况下,obj1的编码实例是ISO-8859-1,而obj2的编码实例是ASCII-8BIT。 然后使用ASCII-8BIT将obj1的编码实例转换为force_encoding

assert_equal(obj1.force_encoding(Encoding::ASCII_8BIT), obj2)

有关详细信息,请查看https://ruby-doc.org/core-2.2.0/Encoding.html

答案 2 :(得分:0)

我遇到以下错误:

No visible difference in the String#inspect output.

并尝试了@ Protocol的回答 - 我得到了这个:

NoMethodError: undefined method `encoding' for "5930128297ebef21e1c7fd50":BSON::ObjectId

我正在使用Mongoid,所以至少对于这个问题,解决方法是在to_s对象上调用BSON,我的字符串相等就是我的预期。

答案 3 :(得分:0)

如果您只想与断言匹配,您始终可以将这两个值都转换为其他类型。

例如:

assert_equal object_one.to_s, object_two.to_s