每当我尝试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。
答案 0 :(得分:7)
当断言失败时,会显示此消息,这有点不是错误,但MiniTest无法找到对象之间的差异。
diff
在两个对象上运行#inspect
并在其上运行diff工具。如果没有差异,则会显示此消息。
原则上,您需要两个在检查时不等于具有不同输出的对象。虽然这并不是一成不变的,但红宝石标准库中的某些类不会像Time
那样完全填充此属性。谈到自己的课程,也许您已经编写了自定义#inspect
方法?
关于Time
,检查只显示秒,而不是分数,但是等于查看分数,因此两个时间对象可能不相等,但在检查时看起来仍然相同。
关于Array
,如果其中包含的对象可能不相等但在检查时看起来相同,则会导致显示该消息。
即使检查输出不同,如果您收到此消息,则diff工具出现问题。 MiniTest试图做一些有关使用哪种diff工具的有根据的猜测。您可以通过打印MiniTest::Assertions.diff
来检查所选的差异工具。
如果真正的问题是您的对象在您期望它们时是不相等的,那么您应该看看如何在各个类中定义==
方法。默认实现会查看实例化时为每个对象提供的对象ID,这可能不是您想要的,例如处理表示数据库行的对象。
答案 1 :(得分:1)
也许是2个对象'编码实例是不同的。使用encoding
和force_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)
答案 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