0

我在Ruby中有一个测试如下

def testSomeObjectsAreEqual
  assert_equal( object1, object2 )
end

当此测试失败时,我收到一条错误消息,指出两个对象不相等,并为预期值和实际值提供以下消息样式:

<#<Java:com.mynamespace.MyClass:0x1232b3e12>> expected but was
<#<Java:com.mynamespace.MyClass:0x489654ebd>>.

如您所见,我正在使用 JRuby 来实例化一个 Java 类,这就是被比较的对象。我尝试在 Ruby 中打印 object.to_s 并打印出一条看起来很合理的消息,它似乎直接映射到为 MyClass 声明的 Java 声明的 toString() 方法,但是 to_s 似乎没有用于断言的失败消息。无论如何我可以让 Ruby 测试/单元使用对象的 to_s 值,因为这会使失败消息对我更有用?

4

4 回答 4

1

У您可以在失败消息中添加一些注释:

assert_equal( object1, object2, "my message: #{object1.to_s},  #{object2.to_s}" )
于 2012-05-05T13:02:12.270 回答
1

Test::Unit (我想这就是您正在使用的)用于#pretty_inspect将对象转换为可打印的形式。您可以为您的班级覆盖/猴子补丁;您只需要在测试脚本中这样做。

于 2012-05-05T08:12:38.910 回答
0

我建议不要在单元测试中直接比较对象,而是测试不同的属性是否相同——这将在部分测试失败时为您提供更多信息。您可能会遇到直接对象比较的微妙之处,这可能不会为您的整体测试增加任何价值。

因此,如果对象具有包含 first_name、last_name 和 status 的属性,我建议以这种方式重写测试:

def testSomeObjectsAreEqual
  assert_equal( object1.first_name, object2.first_name )
  assert_equal( object1.last_name, object2.last_name )
  assert_equal( object1.status, object2.status )
  ... etc ...
end
于 2012-05-05T13:12:23.980 回答
0

我不确定我是否正确理解了这个。但是,您可以在您的类中创建一个方法,该方法接受参数作为对象(它自己的类)。如果比较失败,您可以raise抛出异常(比如说),然后通过以下方式相应地断言它:

assert_raises(TypeError){object1.compare(object2)}

可能有错误,请在这里纠正我。

于 2012-05-05T08:22:01.147 回答