programing

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

i4 2023. 6. 15. 21:34
반응형

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-rspec의 기본 규칙 옵션RSpec/MessageSpies다음은 당신이 할 수 있는 일입니다.spy:

메시지 기대는 테스트 중인 코드를 호출하기 전에 예제의 기대를 시작에 둡니다.많은 개발자들은 구조화 테스트를 위해 어레인지-액트-assert(또는 그때 주어진) 패턴을 사용하는 것을 선호합니다.스파이는 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")
  • 공식 문서: https://relishapp.com/rspec/rspec-mocks/docs/basics/spies
  • rubocop-rspec: https://docs.rubocop.org/projects/rspec/en/latest/cops_rspec/ #rspec 메시지 스파이

언급URL : https://stackoverflow.com/questions/21262309/rspec-how-to-test-if-a-method-was-called

반응형