2017-11-20 5 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 

을 당신이 컨트롤러를했다하더라도, 당신은 가능성이 가장자리 케이스를 충당하기 위해,이 메서드 호출을 스텁해야 할 것이다.

확인하는 double을 사용하는 경우 헬퍼에 정의되지 않은이 스터 빙 방법은 실패합니다.

내 문제가 페이지로 GET 요청을함으로써 해결되었다
0

: 도우미 메서드는 호출하는 모든 PARAMS와 컨트롤러 행동에 액세스 할 수 있습니다 홈페이지로 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 

. 모든 테스트 케이스가 통과되었습니다.