10

リモート サーバーに対して HTTP POST を実行する静的メソッドがあります。

このメソッドが必要なときにいつでも正しい引数で呼び出されることをテストしたいのですが、実際に実行されないようにして、テスト中に実際の HTTP 要求を実行しないようにしたいと考えています。

そのメソッドをグローバルにスタブして、実際に実行されないようにするためにすべてのテストケースでそれを行う必要がないようにするにはどうすればよいですか? そうする場合、実際のメソッドをテストする特定のテストケースに対してどのようにスタブを解除しますか?

4

1 に答える 1

7

すべての仕様で単にメソッドをスタブ化し、呼び出されるたびに正しい引数を受け取ることを確認したい場合 (それぞれの場合で同じであると仮定して)、ブロックspec_helper内にスタブを追加するだけです。before(:each)

RSpec.configure do |config|
  ...
  config.before(:each) do
    SomeClass.stub(:some_static_method).with(...).and_return(...)
  end
  ...
end

指定した引数以外でスタブが呼び出された場合、これは失敗します。should_receive@appneadiving が提案したように使用することもできますが、呼び出さany_number_of_timesなくても失敗しないように呼び出す必要があることに注意してください。これは基本的にスタブを使用する場合と同じです (このディスカッションを参照) 。 .

もう 1 つの方法は、webmock gem を使用して、特定の URL へのリクエストをスタブ化することです。このアプローチを使用すると、(必ずしも) メソッドをスタブする必要はありません。指定した引数でサーバーにアクセスしようとするたびに、特定の応答を取得するという確実性で、通常どおり実行させることができます。

仕様全体で webmock を使用するには、spec_helper上記のような行を追加して、stub_requestメソッドを呼び出す必要があります。

stub_request(:any, "www.example.com").with(:query => { :a => "b"}).to_return(...)

それが役立つことを願っています。

于 2012-10-09T09:12:59.843 に答える