Отключить "ожидать получения" в RSpec

У меня есть ожидание в 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 ответ

Это можно сделать с помощью метаданных, чтобы установить другое ожидание для этого конкретного примера, но вам нужно получить доступ к метаданным в 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
Другие вопросы по тегам