Rspec:为什么你可以将测试双重传递给你的应用程序代码?

时间:2013-03-07 15:29:10

标签: ruby-on-rails ruby rspec

我正在阅读rspec-mocks,并对Message Expectations感到困惑。

  

消息期望是测试双倍的期望   在示例结束之前的某个时间收到消息。如果消息是   收到了,期望得到满足。如果没有,则示例失败。

validator = double("validator")
validator.should_receive(:validate).with("02134")
zipcode = Zipcode.new("02134", validator)
zipcode.valid?

所以我的理解是你创建一个虚拟对象并指定它应该“接收”一个消息(来自ActiveModel的这个validate)并带有参数02134。如果它在某个时刻发生,则该测试将通过。

我的问题是:

  1. 为什么可以将validator传递给Zipcode.new?您的应用程序代码是否应该采用额外的参数(测试双精度)?

  2. “收到消息”对于测试双重意味着什么?这是否意味着它将被消息调用(在这种情况下是validate方法)?

  3. 谢谢!

1 个答案:

答案 0 :(得分:2)

Ruby中没有类型,所以你可以向任何方法发送任何对象。这会回答您的1

对于2

双打非常棒,因为要测试一个孤立的方法,实际上你不需要一个完整的对象。

should_receive(:foo)表示:

  • 您希望双人获得foo方法(某处your_double.foo

  • foo将不会被调用,但它可以返回您想要的结果(使用and_return)来继续您的规范。