2014-10-25 2 views
0

rspec의 레이크 작업에서 Date.today.wday를 조롱하려고합니다.레일즈 RSpec이 레이크 작업에서 Date.today.wday를 조롱했습니다.

보석 버전 : RSpec에 2.14.8은 --- 루비 여기에 2.0.0

--- 4.1.1 레일 것은 무엇을 내가해야 할 본질적으로 설명하기 위해 내 테스트의 단순화 된 가짜 버전을 시도하고있다 :

describe "scheduler" do 
    describe ":thursday_invitations" do 
    let(:run_issue_invites) do 
     Rake::Task[:thursday_invitations].reenable 
     Rake.application.invoke_task :thursday_invitations 
    end 

    before do 
     Rake.application.rake_require 'tasks/scheduler' 
     Rake::Task.define_task(:environment) 
     Date.today.should_receive(:wday).and_return(4) ###MY NEMESIS CODE LINE 
    end 

    context "on thursday" do 
     it "issues invitations" do 
     expect(Date.today.wday).to eq(4) ###THE VERIFICATION TEST THAT KEEPS FAILING 
     run_issue_invites 
     expect(<other_stuff_to_test>).to <return_properly> 
     end 
    end 
    end 
end 

이렇게 실제 키는 Date.today.wday를 조롱합니다. 매주 어떤 요일 에든 내 스펙을 실행할 수 있기를 원하기 때문에이 메소드를 모방하거나 스텁하여 "4"(Rails에서 Thursday 목요일의 숫자)를 항상 리턴해야합니다. 그래서, 처음에는 테스트가 "4"(테스트에서 어설 션)를 수신하는지 먼저 확인하도록 설정했습니다. 오늘 (말하자면) 금요일 일 경우 테스트를 실행하면 "4"가 나오지만 "5"가 나오면 실패합니다. 즉, 메서드를받을 때 원하는 값을 반환하지 않습니다. 나는 비효율적 인 비슷한 결과로 스터 빙을 시도했다. 일반적으로 조롱은 산들 바람이지만 전화가 걸려 오는 전화는 .wday이며 Date.today에서 작동합니다.

이것은 레이크 작업 (I 조롱와 같은 익숙한 아니에요한다), 내가 더 뭔가를 지정해야 할 수도 있습니다,하지만 난 그것의 바닥에 얻을 수 없었던 때문에 ...

기타 명확한 정보가 필요한 경우 알려주십시오.

답변

2

당신이 기대하는 동작을 보지 못하는 이유는 당신이 조롱하고있는 객체가 테스트 대상과 동일하지 않다는 것입니다. object_id 후속 호출에 다른 것을

[1]> Date.today.object_id 
70104549170200 
[2]> Date.today.object_id 
70104552970360 

사실을 Date.today 각 통화가 새로운 객체를 반환하는 것을 의미에 : 레일 4+ 환경에서

이 내가 레일 콘솔에 표시되는 내용입니다. 따라서 Date.today.should_receive(:wday).and_return(4)은 절대로 다시 사용하지 않을 객체에 기대를 설정하고 있습니다.

매번 Date.today에 의해 동일한 개체가 반환되도록 사양을 다시 작성해야합니다. 다음은 명확한 설명을 위해 예제의 다른 부분을 생략 한 하나의 해결책입니다.

let!(:today) { Date.today } 

before do 
    Date.stub(:today).and_return(today) 
    today.should_receive(:wday).and_return(4) 
end 

it "issues invitations" do 
    expect(Date.today.wday).to eq(4) 
end 
+0

최고 감사합니다! 검색 및 독서에서 어떻게 그런 방식으로 쇠사슬로 묶인 방법을 작성해야하는지 명확한 예를 찾을 수는 없었지만 더 넓은 설명은 훌륭했습니다. 문제를 해결하는 것은 대단한 일이지만, 나는 스터 빙 (stubbing)의 개념을 더 잘 배웠다는 사실에 훨씬 더 흥분하고 있습니다! 너 락. – cjn

+0

예, 제가 제안한 솔루션 대신 스텁 체인을 사용할 수 있습니다. 나는 이것을 자주 사용하지 않지만,'Date.stub_chain (: today, : wday) .and_return (4)'와 같은 것을 보게 될 것입니다. 당신을 위해 무엇이든지 작동합니다. – rossta

관련 문제