21

次のようなコードがあります。

while response.droplet.status != env["user_droplet_desired_state"] do
   sleep 2
   response = ocean.droplet.show env["droplet_id"]
   say ".", nil, false
end

サーバーが特定の状態になるまで待機するようにアプリを設定できるという考えです(たとえば、再起動してから、再びアクティブになるまで監視します)

ただし、テストで webmock を使用しているため、2 回目に別の応答を返す方法がわかりません。

たとえば、次のようなコードです。

  stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
     with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
     to_return(:status => 200, :body => fixture('show_droplet_inactive'), :headers => {})

  stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
     with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
     to_return(:status => 200, :body => fixture('show_droplet'), :headers => {})

「最初は非アクティブとしてマークして、ループが1回通過し、その後アクティブとしてマークする」という考えで

ドキュメントによると、スタブは「最後に見つかったものが機能する」ように行われます。

リクエストに一致する最後に宣言されたスタブが常に適用されます。

stub_request(:get, "www.example.com").to_return(:body => "abc")

stub_request(:get, "www.example.com").to_return(:body => "def")

Net::HTTP.get('www.example.com', '/') # ====> "def"

Webmock で異なる結果を持つ同じエンドポイントへの複数の呼び出しをモデル化することは可能ですか?

4

1 に答える 1

40

に複数の引数を渡す#to_returnと、毎回次の応答で応答し、最後の応答を何度も返し続けます。例えば:

require 'webmock/rspec'
require 'uri'

describe "something" do
   it "happens" do
      stub_request(:get, 'example.com/blah').
        to_return({status: 200, body: 'ohai'}, {status: 200, body: 'there'})

      puts Net::HTTP.get(URI('http://example.com/blah'))
      puts Net::HTTP.get(URI('http://example.com/blah'))
      puts Net::HTTP.get(URI('http://example.com/blah'))
      puts Net::HTTP.get(URI('http://example.com/blah'))
   end
end

として実行するとrspec <file>、次のように出力されます。

ohai
there
there
there
于 2015-11-29T00:34:07.603 に答える