如何在cucumber中存根一个方法?

4
我想要在SubmissionsController中桩空space_available_mb方法,使其返回5。但是这样做不起作用。它会返回真实硬盘上的正确空间。

如果注释掉space_available_mb,就会抛出期望错误,这意味着should_receive正常工作。然而,它并没有返回5,而是真实数字,这意味着and_return由于某种原因失败了。

进一步调试发现,and_return实际上被调用了,但只有在方法运行并返回真实数字后才会被调用。
Scenario: Hard Disk Space is low on new submission
  Given I am on the new_submission page
  And hard disk space is low
  Then I should see "Low disk space!"

Given /^hard disk space is low$/ do
  SubmissionsController.should_receive(:space_available_mb).and_return(5)
end

class SubmissionsController < ApplicationController
  include FileManager

  def new
    space = space_available_mb
    ...
  end
end

module FileManager
  def space_available_mb
    ...
  end
end

这个链接对你有帮助吗? - farnoy
1
@farnoy讲解了如何创建一个Mock对象,在这种情况下,我需要对控制器方法进行存根操作。 - siamii
请注意,这通常不是一个好主意。Cucumber通常应该测试整个堆栈。您的使用情况——在本质上尝试对外部服务进行存根操作——是唯一建议这样做的时间点。 - Marnen Laibow-Koser
1个回答

5

根据不同的mock框架,语法会有所差异,但你想要完成的是对你的控制器任意实例的方法进行存根处理。在RSpec中,你可以使用 这个。所以根据你的尝试:

Given /^hard disk space is low$/ do
  SubmissionsController.any_instance.should_receive(:space_available_mb).and_return(5)
end

如果你打算使用其他任何模拟框架,都会有像RSpec的any_instance这样的方法。


1
事实证明,any_instance确实是其中一个问题。另一个问题是硬盘空间不足的步骤应该在我在新提交页面之前。 - siamii
你能否对上述两种解决方案分别运行 puts SubmissionsController.new.space_available_mb 以及 SubmissionsController.any_instance.stub(:space_available_mb).and_return(5) - farnoy
那么,你所问的一切都在这里讲到了吗? - farnoy
1
我遇到了 undefined method `any_instance_recorder_for' for nil:NilClass 的问题,而这个链接 https://dev59.com/FmMl5IYBdhLWcg3wDjOg#18753331 并没有帮助我解决。我正在尝试在每个场景中存根一个活动记录对象。我已经在 rspec 2.14 和 rspec 2.99 中尝试过了。 - davidtingsu
4
@davidtingsu 你需要使用rspec doubles。在cucumber的env.rb文件中加入以下代码:require 'cucumber/rspec/doubles' - sma
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接