以下几行 (rspec) 代码之间有什么区别,无论它们相同还是不同,什么时候应该使用一个而不是另一个?
book = double("book")
allow(book).to receive(:title) { "The RSpec Book" }
对比
book = double("book")
book.stub(:title).and_return("The RSpec Book")
最佳答案
有2处不同,但结果完全一样。两者都与 rspec 模拟/期望语法有关。
使用#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
使用 block 而不是#and_return 来定义返回值。这与提到的语法更改无关;这两种方法已经可用了很长一段时间(自 rspec 1 起)。使用#and_return 方法更合适,因为它是 (a) 默认方式,(b) 更具可读性,并且 (c) 没有任何运行时开销。使用 block 的第二种方法通常保留给极端情况,当您希望返回更具动态性质的东西时 - 不是常量,而是某种计算。
您的问题的答案是结合使用两者:
- 使用#allow 代替#stub
- 使用#and_return 而不是 block ,除非你需要返回动态计算的值
例如:
book = double('book')
allow(book).to receive(:title).and_return('The RSpec Book')
关于ruby - Allow vs Stub,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18180389/