【问题标题】:How to stub a method in cucumber?如何在黄瓜中存根方法?
【发布时间】:2012-03-12 12:15:30
【问题描述】:

我想删除 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

【问题讨论】:

  • this 对您有帮助吗?
  • @farnoy 解释了如何创建模拟对象。在这种情况下,我需要存根控制器方法。
  • 请注意,这通常不是一个好主意。 Cucumber 通常应该测试完整的堆栈。您的用例(实际上是在尝试对外部服务进行存根)大约是唯一可取的情况。

标签: ruby-on-rails ruby rspec cucumber stub


【解决方案1】:

根据模拟框架,语法会有所不同,但您想要完成的是在控制器的任何实例上存根方法。在 RSpec 中,您有 this。所以根据你的尝试:

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

如果您打算使用任何其他模拟框架,那么RSpec 的any_instance 肯定会有这样的方法。

【讨论】:

  • 不幸的是,any_instance 似乎没有什么不同。有趣的是,据报道该方法被调用,因为如果我将调用注释掉,则会抛出一个 MockExpectationError 。但是,返回值不会被替换。 (不返回 5)
  • 事实证明any_instance 确实是问题之一。另一个问题是hard disk is low 步骤应该出现在I'm on the new_submission page 之前
  • 你能puts SubmissionsController.new.space_available_mb 上面的解决方案和SubmissionsController.any_instance.stub(:space_available_mb).and_return(5) 吗?
  • 我得到了 nil:NilClass 的未定义方法 `any_instance_recorder_for' 而这个链接 stackoverflow.com/a/18753331/1123985 没有帮助。我试图在每个场景中存根一个活动记录对象。在 rspec 2.14 和 rspec 2.99 中尝试过。
  • @davidtingsu 你需要 rspec 双打。将以下内容放入黄瓜的 env.rb 文件中:require 'cucumber/rspec/doubles'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多