如何获取Ruby单元测试失败消息以打印对象内容而不是地址?

时间:2012-05-05 08:06:08

标签: ruby tdd jruby

我在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 个答案:

答案 0 :(得分:1)

Test :: Unit(我假设你正在使用的)使用#pretty_inspect将对象转换为可打印的形式。你可以为你的班级覆盖/ monkeypatch这个;你只需要在测试脚本中这样做。

答案 1 :(得分:1)

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

assert_equal( object1, object2, "my message: #{object1.to_s},  #{object2.to_s}" )

答案 2 :(得分:0)

我不确定我是否得到了这个。但是,你可以在你的类中创建一个接受参数作为对象(它自己的类)的方法。如果比较失败,您可以raise例外(比如说),然后相应地断言:

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

可能是错的,请在这里纠正我。

答案 3 :(得分:0)

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

因此,如果对象具有包含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