2013-08-13 1 views
1

rspec 테스트를 사용하여 컨트롤러 메소드에서 함수가 호출되었는지 확인하려고합니다. 이렇게하려면 confirming an instance of a class receives a message에 대한 relishapp 설명서를 따르고 있습니다. 다음과 같이 내 구현은 다음과 같습니다, 나는 delay을 확인하기 위해 노력하고있어이 경우rspec을 사용하여 컨트롤러 내에서 함수가 호출 됨

Failure/Error: Unable to find matching line from backtrace 
    Exactly one instance should have received the following message(s) but didn't: delay 

: 나는 다음과 같은 오류가 계속하지만

it "does the job" do 
    expect { 
     post :create, {:obj => valid_attributes} 
    }.to change(Object, :count).by(1) 
    Object.any_instance.should_receive(:delay) 
    flash[:notice].should eq(I18n.t(:success, obj: 'object', past_participle: 'created')) 
    response.should redirect_to(new_object_path) 
    end 

: 그러나, 나는 다음과 같은 오류가 계속 메서드가 호출되었습니다. 분명히 메서드가 컨트롤러 메서드에서 호출 된 것을 볼 수 있습니다. 왜 rspec이이를 확인하지 못합니까?

+1

게시물 요청을하기 전에 should_receive 전화를 걸어보십시오. –

+0

실제로 스펙이 전혀 전달되지 않습니다. 지금은 어떤 방법으로 검사했는지에 따라 다른 오류가 발생하지만 컨트롤러 메서드는 작동하지 않습니다. 이 pastie의 오류에 대한 자세한 설명을 참조하십시오. http://pastie.org/private/yvvanhw95fnrercqth9ugg –

답변

1

필자가 보았 듯이이 동작을 테스트하는 데는 두 가지 방법이 있습니다.

지연된 작업 설명서에서 제안하는대로 Delayed::Worker.delay_jobs = false으로 테스트 할 때 cio_register() 메서드가 지연되는 것을 무시할 수 있습니다. 나는 이것이 지연된 직업이 효과가 있다고 우리가 안전하게 추측 할 수 있기 때문이라고 믿습니다. 지연이 메소드의 동작에 중요한

describe '#create' 
    it 'creates a new Object' do 
    expect { 
     post :create, {:object => valid_attributes} 
    }.to change(Object, :count).by(1) 
    end 

    it 'performs CIO registration on new object' do 
    # Skip Delayed Jobs. 
    original_setting = Delayed::Worker.delay_jobs 
    Delayed::Worker.delay_jobs = false 

    # Our expectation. 
    Object.any_instance.should_receive(:cio_register) 

    post :create, {:object => valid_attributes} 

    # Restore Delayed Job's setting. 
    Delayed::Worker.delay_jobs = original_setting 
    end 

    it 'sets appropriate flash message' 
    it 'redirects to path showing details of newly created Object' 
end 

경우, 테스트 작업을 작업하고 그 결과를 보장 할 수 :

it 'performs CIO registration on new object' do 
    # Our expectation. 
    Object.any_instance.should_receive(:cio_register) 

    post :create, {:object => valid_attributes} 

    # Let's process the delayed job. 
    Delayed::Worker.new.work_off 
end 
을 다음과 같이

나는 테스트를 다시 작성합니다

Google 검색 중이 흥미로운 항목을 발견했습니다. http://artsy.github.io/blog/2012/08/16/testing-with-delayed-jobs/

+0

감사합니다. 지연된 작업 설명서에서 특수 테스트를 확인하지 않았습니다. –

+0

또한이 문제를 다루는 사람은 두 번째 코드 스 니펫을 사용했습니다. –

관련 문제