ruby - Allow vs Stub,有什么区别?

标签 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")

最佳答案

有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. 使用 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/

相关文章:

ruby-on-rails - 无法使用 Rubber 连接到 ec2

ruby-on-rails - 启用js时验收测试失败

ruby - 如何匹配 capybara 中的完整链接?

ruby-on-rails - 在 rspec 特性测试中使用 Devise

ruby-on-rails - 创建一个给定字符串 (fname lname) 的方法返回两个

ruby-on-rails - Ruby:循环和调用关联数组(TypeError 没有将字符串隐式转换为整数)

ruby - 引用可枚举方法 block 内的调用者对象

ruby - Sinatra:运行 rspec 测试时记录噪音

ruby-on-rails - Rails::Generator 没有在 spec 文件夹中创建工厂

ruby - Ruby 中的哈希成语的哈希?