2015-02-24 43 views
5

每当我试着assert_equal两个对象,我总能得到象这样的错误:MINITEST断言失败的检查

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

这是发生与时间和阵为好。 Minitest的文档在这方面也没有多说太多。

我使用Ruby 2.0.0,但我使用的是2.2.0,发生的情况也是如此。也使用最新的minitest。

此外,我运行Ubuntu 14.10。

+0

这是否真的发生*所有*对象,你有没有试过比较像整数一样的基本东西?你能举一些例子吗? – Jesper 2015-02-24 14:28:10

+0

您使用的是自定义difftool吗? – Jesper 2015-02-24 14:28:56

+0

它实际上只是发生在我创建的时间,数组和自定义对象上,比如User类。我没有使用任何自定义工具。 示例: 'result = @ service.run' 'result.must_equal(@ users.get_single(1))' 注意:我也尝试了assert_equal,并且发生了同样的情况 – 2015-02-24 14:34:42

回答

7

关于该消息

该消息,这有点不是错误,示出当断言失败,但MINITEST未能找到对象之间的差异。

Check out this method

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

原则上,您希望两个不相等的对象在检查时具有不同的输出。这不是写在石头上,红宝石标准库中的一些类不会填充此属性,如Time。当涉及到你自己的班级时,也许你已经写了一个自定义的#inspect方法?

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

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

如果即使检查输出不同,您也会收到此消息,但diff工具有问题。 MiniTest试图对使用哪种diff工具进行一些有教育的猜测。您可以通过打印MiniTest::Assertions.diff来检查所选的差异工具。

在对象平等

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

+0

我没有创建自定义#inspect方法在任何对象上,而奇怪的是我只是在不同的环境(OS X Yosemite)上测试了一切,并且一切正常 – 2015-02-24 15:13:06

+0

原始系统是什么? – Jesper 2015-02-24 15:14:52

+0

Ubuntu 14.10(这是在我的问题的底部),我用Ruby 2.2和2.0 – 2015-02-24 15:55:54

1

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

puts obj1.encoding 
puts obj2.encoding 

下面是一个例子了放:

ISO-8859-1 
ASCII-8BIT 

在这种情况下OBJ1的编码方式实例ISO-8859-1和OBJ 2的编码实例ASCII-8BIT。 然后OBJ1的编码实例转换ASCII-8BITforce_encoding

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

欲了解更多详情请https://ruby-doc.org/core-2.2.0/Encoding.html

0

我有以下错误:

No visible difference in the String#inspect output. 

,并试图@协议的答案 - 我这个:

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

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