【问题标题】:RSPEC NoMethodError: helper method calling another controller's action -RSPEC NoMethodError:辅助方法调用另一个控制器的操作 -
【发布时间】:2017-11-20 09:18:31
【问题描述】:

我有一个控制器文件:

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

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

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

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

【问题讨论】:

  • 方法不是全局的。您不能只从任何其他位置访问任何方法。所以简短的回答是:不,这是不可能的。不过,如果您能分享更多关于这些方法实际作用的背景信息,我很乐意提供建议的设计。
  • 不可能。实际上在您的情况下也不需要。当我们测试助手代码时,我们不需要调用控制器动作,您可以存根这些动作(因为您将在控制器测试和集成测试中测试这些动作)。所以你需要的只是存根。
  • 好的,谢谢大家。我在想,由于我正在调用辅助方法,它必须具有它正在调用的控制器方法的上下文。我会检查存根解决方案。
  • @TomLord - 控制器是 ApplicationController,通过查看 params[:controller]、params[:action],其中的方法返回字符串,其中包含在页面加载时调用了哪个控制器/方法。我在帮助文件中使用此方法来检查是否调用了控制器的特定方法,基于该方法我在视图端执行了某些操作。

标签: ruby-on-rails ruby rspec


【解决方案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

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

请注意,如果您使用验证双精度,则此存根未在帮助程序中定义的方法将失败。

【讨论】:

    【解决方案2】:

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

    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 请求后,辅助方法将可以访问它正在调用的所有参数和控制器操作。我所有的测试用例都通过了。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多