允许vs Stub,有什么区别?

Cha*_*rse 30 ruby rspec

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

book = double("book")
allow(book).to receive(:title) { "The RSpec Book" }
Run Code Online (Sandbox Code Playgroud)

book = double("book")
book.stub(:title).and_return("The RSpec Book")
Run Code Online (Sandbox Code Playgroud)

jur*_*lic 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 /的计划换rspec的-3

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

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

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

例如:

book = double('book')
allow(book).to receive(:title).and_return('The RSpec Book')
Run Code Online (Sandbox Code Playgroud)