【问题标题】:Multiple calls to the same endpoint with different results in webmock?在 webmock 中多次调用同一个端点并产生不同的结果?
【发布时间】:2015-10-18 04:41:32
【问题描述】:

我有一些看起来像这样的代码:

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

您可以将应用设置为等到服务器处于某种状态(例如,重新启动它,然后观察它直到它再次处于活动状态)

但是,我在测试中使用 webmock,我无法找到第二次给出不同响应的方法。

例如这样的代码:

  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 => {})

想法是“第一次标记为非活动,因此循环通过一次,然后标记为活动”

The documentation says that stubs are just done as "Last one found will work":

始终应用与请求匹配的最后声明的存根 即:

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 中对同一端点的多个调用进行建模,但结果不同?

【问题讨论】:

    标签: ruby rspec mocking webmock


    【解决方案1】:

    如果您将多个参数传递给#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
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多