私はいくつかの外部サービスを呼び出すSinatraアプリケーションを書いています。私はこの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
私はこれを注入するための2つの方法を考えることができますに明らかに私のテストは、実際のサービスを呼び出さないので、現時点で想定したいです。私はインスタンスメソッドを呼び出すか、コンストラクタを介して依存関係を渡すことができます。とにかくラックは現在のアプリケーションインスタンスにアクセスできないようですが、これは不可能です。
これはクラスメソッドを宣言できますが、可能であればインスタンスで作業することをお勧めします。各ケースで異なる注入を潜在的に可能にし、状態をロールバックすることを忘れた場合に他のテストに悪影響を与える可能性のあるグローバル状態を回避する。
これを行う方法はありますか?
ありがとうございます。
私はあなたの最初のアイデア(インスタンスメソッドの呼び出しを直接)が好きで、同様の問題があります。私はテスト内で通常の意味で私のアプリを初期化しようとします。 'app = MyApp.new'ですが、このインスタンスでインスタンスメソッドを呼び出すことができません。 Sinatra :: Baseの何かがパブリックインスタンスメソッドを妨害しますか? 編集 - あなたがこのアプローチが好きなら、このスレッドはあなたを助けるかもしれません: http://stackoverflow.com/questions/12072865/calling-a-sinatra-app-instance-method-from-testcase –