Я пишу приложение Sinatra, которое вызывает некоторые внешние службы. Я хочу, очевидно, мои тесты, чтобы избежать вызова реальных сервисов, так что предположим, что у меня есть этот
class MyApp < Sinatra::Base
get '/my_method' do
@result = ExternalServiceHandler.new.do_request
haml :my_view
end
end
И в моем тесте
describe "my app" do
include Rack::Test::Methods
def app() MyApp end
it "should show OK if call to external service returned OK" do
@external_service_handler = MiniTest::Mock.new
@external_service_handler.expect :do_request, "OK"
#Do the injection
get '/my_method'
response.html.must_include "OK"
end
it "should show KO if call to external service returned KO" do
@external_service_handler = MiniTest::Mock.new
@external_service_handler.expect :do_request, "KO"
#Do the injection
get '/my_method'
response.html.must_include "KO"
end
end
Я могу думать о двух способах введения этого. Я могу вызвать метод экземпляра или передать зависимость через конструктор. Так или иначе, поскольку стойка, похоже, не дает мне доступ к текущему экземпляру приложения, я нахожу это невозможным.
Я могу объявить метод класса для этого, но я предпочел бы работать с экземплярами, если это возможно. Чтобы потенциально возможно иметь разные инъекции в каждом случае и избегать глобального состояния, которое может повредить другие тесты, если я забуду состояние отката.
Есть ли способ сделать это?
Спасибо заранее.