RSpec : 메서드가 호출되었는지 테스트하는 방법은 무엇입니까?


112

RSpec 테스트를 작성할 때 테스트를 실행하는 동안 메서드가 호출되었는지 확인하기 위해 다음과 같은 코드를 많이 작성했습니다. 메서드가 수행하는 작업이 효과를보기가 쉽지 않기 때문에 호출 후 개체의

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
    called_bar = false
    subject.stub(:bar).with("an argument I want") { called_bar = true }
    subject.foo
    expect(called_bar).to be_true
  end
end

내가 알고 싶은 것은 : 이것보다 더 좋은 구문이 있습니까? 위의 코드를 몇 줄로 줄일 수있는 펑키 한 RSpec 굉장함을 놓치고 있습니까? should_receive이 작업을 수행해야하는 것처럼 들리지만 더 읽어 보면 정확히 수행하는 작업이 아닌 것 같습니다.


3
여기에서 확인하십시오 : stackoverflow.com/questions/1328277/…
kddeisz

@Peter Alfvin OP가에서 구문을 요청 should_receive했기 때문에 그 질문이 도움이 될 것이라고 생각했습니다.
kddeisz

답변:


141
it "should call 'bar' with appropriate arguments" do
  expect(subject).to receive(:bar).with("an argument I want")
  subject.foo
end

1
죄송합니다. "to .. receive (: bar)"형식이이 예제에서 "called_bar"값을 확인하는 방법을 이해하지 못합니다. 설명해 주시겠습니까?
ecoding5

2
@ ecoding5 아니. 확인하지도 않고 called_bar. 메서드가 호출되었는지 확인하는 플래그 일 뿐이지 만 expect(...).to receive(...)이미이를 다루고 있습니다. 더 명확하고 의미 적입니다
wacko

@wacko oooh, 알았습니다. 정리해 주셔서 감사합니다. 나는 그것을 처음으로 잡지 않았다.
ecoding5


37

아래가 작동합니다

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
     subject.stub(:bar)
     subject.foo
     expect(subject).to have_received(:bar).with("Invalid number of arguments")
  end
end

문서 : https://github.com/rspec/rspec-mocks#expecting-arguments


감사합니다- "NoMethodError"has_received를 받았습니까? -이것이 rspec versoins와 관련이 있다고 생각하십시오. 나는 (사람이 올바른 위를 마크) 나를 위해 일한 다른 해결책을 발견
마이키 호 가스

@MikeyHogarth이 대답은 내가 아는 RSpec 버전의 일부가 아닌 것이 아니라 ( have_received사실 "스파이"접근 방식) 을 제안했습니다 has_received.
Peter Alfvin

2

RSpec ~> 3.1 구문과 rubocop-rspecrule의 기본 옵션 을 완전히 준수하기 위해 다음과 같이 RSpec/MessageSpies할 수 있습니다 spy.

메시지 기대는 테스트 대상 코드를 호출하기 전에 시작 부분에 예제의 기대치를 표시합니다. 많은 개발자들은 테스트를 구조화하기 위해 배열-행동-어설 션 (또는 주어진 시점) 패턴을 사용하는 것을 선호합니다. 스파이는 have_received를 사용하여 사후 메시지가 수신되었음을 예상 할 수 있도록함으로써이 패턴을 지원하는 대체 유형의 테스트 이중입니다.

# arrange.
invitation = spy('invitation')

# act.
invitation.deliver("foo@example.com")

# assert.
expect(invitation).to have_received(:deliver).with("foo@example.com")

rubocop-rspec을 사용하지 않거나 기본값이 아닌 옵션을 사용하는 경우. 물론 RSpec 3 기본값을 사용할 수 있습니다.

dbl = double("Some Collaborator")
expect(dbl).to receive(:foo).with("foo@example.com")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.