在 Ruby w/rspec 上的 Cucumber 中,如何 expect/assert 在 Then 子句中进行网络模拟调用?

In Cucumber on Ruby w/rspec, how do I expect/assert a webmocked call in a Then clause?

我正在编写一个 gem 作为远程 API 的客户端,所以我正在使用 webmock 来模拟远程 API,使用 Cucumber 进行测试rspec-模拟礼物。

作为我的 Cucumber 测试的一部分,我打算在 Given 子句中存入我的 API 但随后我想指定远程 API 在 Then 子句。

一个真正基本的例子是:

专题文件

Scenario: Doing something that triggers a call
  Given I have mocked Google
  When I call my library
  Then it calls my Google stub
  And I get a response back from my library

步骤定义

Given /I have mocked my API/ do
  stub_request(:get, 'www.google.com')
end

When /I call my library/ do
  MyLibrary.call_google_for_some_reason
end

Then /it calls my Google stub/ do
  # Somehow test it here
end

问题: 如何验证我的 google 存根已被调用?

旁注:我知道我可以使用 expect(a_request(...))expect(WebMock).to ... 语法,但我的感觉是我将重复 Given 子句中定义的内容。

我自己回答这个问题,尽管最好有人验证这是正确的and/or没有重大缺陷:

Given /I have mocked my API/ do
  @request = stub_request(:get, 'www.google.com')
end

Then /it calls my Google stub/ do
  expect(@request).to have_been_made.once
end

需要注意的是 @request 的赋值和 Then 子句中对它的期望。

在对两个独立场景的有限测试中,这种方法似乎有效。