RSpec에서 "should_receive"를 더 많이 말하는 방법


112

내 테스트에서 이걸 가지고

Project.should_receive(:find).with(@project).and_return(@project)

하지만 객체가 해당 메서드 호출을 두 번 받으면

Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)

다음과 같이 말하는 방법이 있습니까?

Project.should_receive(:find).with(@project).and_return(@project).times(2)

답변:


214

이것은 구식입니다. 아래 Uri의 답변을 확인하십시오

2 회 :

Project.should_receive(:find).twice.with(@project).and_return(@project)

정확히 n 번 :

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project)

n 번 이상 :

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project)

자세한 내용은 https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-countsReceive Counts에서

희망 =)


3
아마도 이것이 작동하지 않는 것 같 any_instance습니까?
Jared Beck

나도 몰라 @YoLudke
자레드 벡

2
Uri의 답변에 언급 된 새로운 구문을 사용해야합니다 .
theblang apr

61

expectrspec 의 새로운 구문은 다음과 같습니다.

2 회 :

expect(Project).to receive(:find).twice.with(@project).and_return(@project)

정확히 n 번 :

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project)

n 번 이상 :

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)

1
have_received구문도 작동합니다. expect(Project).to have_received(:find).exactly(n).times
David Tuite 2014 년

0

@JaredBeck이 지적했습니다. 이 솔루션은 any_instance통화 중에 작동하지 않았습니다 .

어떤 경우에도 should_receive 대신 스텁을 사용했습니다.

Project.any_instance.stub(:some_method).and_return("value")

이것은 어떤 경우에도 작동합니다. 그래도 시간.



0

should_receive와 반대로은 any_instance클래스가 지정된 횟수만큼 메시지를 수신 할 것으로 예상합니다.

any_instance 반면에 일반적으로 메서드를 스터 빙하는 데 사용됩니다.

그래서 첫 번째 경우는 우리가 테스트하고 싶은 기대이고 두 번째 경우는 우리가 계속 진행할 수 있도록 메소드를지나 다음 줄로 넘어가는 것입니다.


1
Drenmi 거의 1 년 전에 추가 한 게시물에 쉼표를 몇 개 추가 해주셔서 감사합니다 ... 답변의 기술적 측면에 아무런 변화가없는 것 같습니다 ... 왜 반대 투표를 하시겠습니까? 나 이거 ...?
amnsan 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.