33

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

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

相对

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

1 回答 1

39

有 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')
于 2013-08-12T13:16:39.407 回答