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

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이 작업을 수행해야하는 것처럼 들리지만 더 읽어 보면 정확히 수행하는 작업이 아닌 것 같습니다.



답변

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


답변

rspec expect구문에서 이것은 다음과 같습니다.

expect(subject).to receive(:bar).with("an argument I want")


답변

아래가 작동합니다

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


답변

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")

답변