允许vs Stub,有什么区别?

时间:2013-08-12 05:56:14

标签: ruby rspec

以下(rspec)代码行之间的区别是什么,无论它们是相同还是不同,何时应该使用一个而不是另一个?

book = double("book")
allow(book).to receive(:title) { "The RSpec Book" }

book = double("book")
book.stub(:title).and_return("The RSpec Book")

1 个答案:

答案 0 :(得分:35)

有2个不同,但结果完全相同。两者都与rspec模拟/期望语法有关。

  1. 使用#allow代替#stub方法。第一种情况使用今年推出的新rspec语法。 现在这是使用rspec的首选方法。尽管旧语法不被弃用,但在rspec3中默认情况下可能会禁用它。关于这个主题的更多信息来自rspec的维护者: http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3

  2. 使用块而不是#and_return来定义返回值。这与提到的语法更改无关;这两种方法已经有很长一段时间了(因为rspec 1)。使用#and_return方法更合适,因为它是(a)默认方式,(b)更具可读性,(c)没有任何运行时开销。使用块的第二种方法通常保留给角落情况,当你希望返回更具动态性的东西时 - 不是常数,而是某种计算。

  3. 您的问题的答案是使用两者的组合:

    • 使用#allow代替#stub
    • 使用#and_return而不是block,除非您需要返回动态计算值

    E.g:

    book = double('book')
    allow(book).to receive(:title).and_return('The RSpec Book')