如何在黄瓜中存根方法?

时间:2012-02-22 06:39:40

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

我想在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

1 个答案:

答案 0 :(得分:5)

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

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

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