Отключить "ожидать получения" в 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