RSPEC NoMethodError:调用另一个控制器动作的辅助方法 -

时间:2017-11-20 09:18:32

标签: ruby-on-rails ruby rspec

我有一个控制器文件:

some_controller.rb:

class SomeController < ActionController::Base
    def get_params
      # Do something with params
    end
end

帮助文件:

module SomeHelper
   def modify_params
      get_params
   end
end

帮助者的rspec文件:

require 'spec_helper'

describe SomeHelper do
   describe 'check_if_param_has_key' do

   it "checks if param has key" do
     modify_params.should eql(true)
   end
end

这里,我在helper方法中调用controller的方法。现在我正在为辅助方法modify_param编写测试用例。 但它会引发错误:NoMethodError: get_params

有没有办法在辅助规范中访问控制器的方法? 这是正确的方法吗?或者我错过了什么?

编辑: 控制器是ApplicationController,其中的方法返回包含在页面加载时调用哪个控制器/方法的字符串,通过查看params [:controller],params [:action]

2 个答案:

答案 0 :(得分:1)

由于RSpec的作者pointed out,辅助测试在概念上与控制器无关。所以,即使有办法,你也可能不想将控制器带入画面。您可以在规范中轻松删除方法调用:

describe SomeHelper do
  describe "#foo" do
    before do
      allow(helper).to receive(:bar).and_return("hello")
    end

    it { expect(helper.foo).to eql("hello") }
  end
end

即使你有一个控制器,你也可能需要在那里存根方法,以覆盖边缘情况。

请注意,如果您使用的是验证双打,那么在助手中未定义的方法的存根将会失败。

答案 1 :(得分:1)

我的问题已经通过向页面发出请求来解决:

describe 'check if the home page by checking params', :type => :request do
   it 'return true if page is Home page' do        
     get "/homepage"
     helper.modify_params.should eql(true)
   end
end

在上面的代码中,在调用get请求到主页之后,helper方法将可以访问它正在调用的所有params和controller动作。我的所有测试用例都已通过。