Отключить "ожидать получения" в RSpec - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть ожидание в RSpec, которое установлено в блоке before:

context 'my_context' do
  before :each do
    expect(Net::HTTP).to receive(:new).at_least(:once)
  end

  it_behaves_like MyClient
end

Однако я только что добавил фрагмент кода, который означает, что Net::HTTP не не получите это сообщение в одном конкретном случае.(Примечание: блок shared_examples уже на месте.)

shared_examples MyClient do
  it 'new code returns a 404 before creating a Net::HTTP' do
    # I want to remove the expectation here

    trigger_the_new_use_case
    expect(response).to be_not_found
  end

  it 'does other stuff'
end

Я попытался добавить эту строку, чтобы переопределить ожидание:

expect(Net::HTTP).not_to receive(:new)

... но он просто добавляет другое ожидание;оригинальный все еще там, и все еще не работает.

Я не могу понять, как использовать метаданные, чтобы сделать это, если это возможно.Я пытался разделить блок before:

before :each do
  other_setup_stuff
end

before :each, wont_create_net_http: false do
  # I had hoped that `false` would act as a default value - I can't specify it in
  # hundreds of other tests - but it didn't. `nil` didn't either.
  expect(Net::HTTP).to receive(:new).at_least(:once)
end

before :each, wont_create_net_http: true do
  # This one worked OK
  expect(Net::HTTP).not_to receive(:new)
end

it 'new spec', :wont_create_net_http do
  run_the_spec
end

Как я могу удалить, заменить или отключить ожидание для моей новой спецификации?

1 Ответ

0 голосов
/ 22 февраля 2019

Это можно сделать с помощью метаданных, чтобы установить другое ожидание для этого конкретного примера, но вам нужно получить доступ к метаданным в блоке around и сохранить их для дальнейшего использования:

context 'my_context' do
  # Extract metadata
  around :each do |example|
    @example_wont_create_net_http = example.metadata[:wont_create_net_http]
    example.run
  end

  before :each do
    other_setup_stuff

    if @example_wont_create_net_http
      expect(Net::HTTP).not_to receive(:new)
    else
      expect(Net::HTTP).to receive(:new).at_least(:once)
    end
  end

  it_behaves_like MyClient
end

shared_examples MyClient do
  it 'new code returns a 404 before creating a Net::HTTP', :wont_create_net_http do
    trigger_the_new_use_case
    expect(response).to be_not_found
  end

  # other examples don't change
end
...