ruby 允许与存根,有什么区别?

4c8rllxm  于 2023-03-22  发布在  Ruby
关注(0)|答案(1)|浏览(98)

下面的几行(rspec)代码有什么区别,不管它们是相同还是不同,什么时候应该使用一行而不是另一行?

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

对比

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

lyr7nygr1#

有两个不同之处,但结果是完全相同的。两者都是关于rspec mocks/expectations语法。
1.使用#allow而不是#stub方法。第一种情况使用今年引入的新rspec语法。**这是现在使用rspec的首选方式。**尽管旧语法没有被弃用,但它可能会在rspec 3中默认禁用。有关此主题的更多信息,请从rspec的维护者处获取:https://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/https://rspec.info/blog/2013/07/the-plan-for-rspec-3/
1.使用block而不是#和_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')

相关问题