Stub ApplicationController类方法与Rspec

时间:2012-10-28 00:54:00

标签: ruby-on-rails rspec tdd

如何在Rspec中存储下面的set_headers类方法?

application_controller.rb

class ApplicationController < ActionController::Base

  def self.set_headers(name) 
     after_filter do
       object = instance_variable_get("@#{name}")
       headers['fancy'] = object.fancy_header
     end
  end

end

regular_controller.rb

class RegularController < ApplicationController
  set_headers :regular

  def index
    # do regular stuff
  end
end    

我在下面尝试了以下内容但它不起作用。

regular_controller_spec.rb

describe RegularController do
  before(:each) do
    ApplicationController.any_instance.stub(:set_headers).and_return({this: 'params'})
  end
end

2 个答案:

答案 0 :(得分:0)

快速测试一下,发现这应该有效:

controller.class.stub(:set_headers).and_return({this: 'params'})  

答案 1 :(得分:0)

这里有很多问题:

    定义set_headers时会调用
  • RegularController。这在规范运行之前很久就会发生,因此对set_headers方法进行存根将不起作用。
  • RegularController类定义中,set_headers的接收方为RegularController(因为类定义中的self是类对象本身)。您尝试过的存根在set_headers的任何实例上存根ApplicationController,但它不是ApplicationController的实例方法。

我无法真正推荐如何实现您想要做的事情,因为您不清楚自己要做什么。