Вы вызываете метод map_typeform_response
в классе HealthProfile
, а не в экземпляре класса.
изменить
allow_any_instance_of(HealthProfile).to receive(:map_typeform_response).and_return(new_hp_after_mapping)
на
allow(HealthProfile).to receive(:map_typeform_response).and_return(new_hp_after_mapping)
Это происходит потому, что rspec не позволяет вам высмеивать или заглушать метод, который не существует на реальном объекте.По умолчанию установлено значение true, так как Rails 4.
RSpec.configure do |config|
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
end
Некоторые другие рекомендации
Я также рекомендовал бы переместить построение переменных new_hp
и new_hp_after_mapping
в let
let(:new_hp) { build(:health_profile) }
let(:new_hp_after_mapping) { build(:health_profile) }
переместите заглушки на before
before do
allow_any_instance_of(TypeformService).to receive(:getResponse).and_return({ 'total_items': 1, 'items': [ new_hp ] }.as_json)
allow(HealthProfile).to receive(:map_typeform_response).and_return(new_hp_after_mapping)
end
, чтобы ваш тест выглядел как
it "expects to fetch typeform response" do
# make sure variable @hp intialized in your test.
get :fetch_typeform_response, params: { id: @hp.id }
expect(response).to redirect_to(health_profile_path(@hp.id))
end