2017-11-20 12 views
1

RSPEC NoMethodError:ヘルパーメソッドの呼び出し、別のコントローラのアクション - 私は、コントローラのファイルを持っている

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は見ることによって、コントローラ/方法は、ページのロードに呼び出された文字列を返す[:コントローラ]、paramsは[:アクション]

+0

方法がグローバルではありません。他の場所からアクセスすることはできません。短い答えは:いいえ、これは不可能です。しかし、これらの方法が実際に何をするかについてもう少し文脈を共有するならば、私は提案されたデザインを提供することができれば幸いです。 –

+0

それはできません。実際にあなたのケースでは、それは必須ではありません。ヘルパーコードをテストするときは、コントローラアクションを呼び出す必要はありません。コントローラテストや統合テストでそれらのアクションをテストするため、それらをスタブすることができます。ここで必要なのはスタブです。 –

+0

よろしくお願いします。私はヘルパーメソッドを呼び出すので、それが呼び出すコントローラのメソッドのコンテキストを持っている必要がありますと思っていた。私はスタビングソリューションをチェックします。 –

答えて

0

として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 

、あなたはおそらくエッジケースをカバーするために、そこにメソッド呼び出しをスタブする必要があると思います。

検証スタンプを使用している場合、ヘルパーで定義されていないこのスタブは失敗します。

0

私の問題は、ページにGETリクエストをすることで解決されています:上記のコードで

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リクエストを呼び出した後、ヘルパーメソッドは、それが呼び出しているすべてのparamsとコントローラのアクションにアクセスできるようになります。すべてのテストケースが合格しました。

関連する問題