在黄瓜测试中存根/覆盖控制器方法?

时间:2018-01-24 17:25:55

标签: ruby-on-rails rspec cucumber

我正在尝试模拟黄瓜测试中的外部API故障。调用外部API的控制器操作是通过名为post_to_connect的控制器方法完成的。该服务在测试期间在本地运行,因此快乐路径测试正常工作。但是,我的控制器操作如下所示:

def create_connection_test

  post_to_connect # posts to external API
  redirect_to '/success'

rescue => e
  @error = e.to_s
  redirect_to '/connection-test/new'
end

我需要强制post_to_connect引发错误,这样我才能为悲伤路径编写黄瓜测试。以下是我尝试过的内容:

在要素文件中:

  Scenario: API failure is handled gracefully
    Given I am on the LDAP Connect stage
    And The connect API will fail
    And I click "Connect"
    Then I see the correct error message

在步骤定义中:

Then(/^The connect API will fail$/) do
  allow_any_instance_of(LdapController).to receive(:post_to_connect)
    .and_raise("some error")
end

这会导致导致控制器方法post_to_connect抛出错误吗?我做错了什么,如何正确地完成覆盖post_to_connect

3 个答案:

答案 0 :(得分:1)

因为请求是从与黄瓜测试不同的进程执行的,所以它们不共享相同的内存。你不能像在单元测试中那样存根。

您必须找到另一种方法来使API调用失败。

答案 1 :(得分:0)

正如Alexis所说 - 这是不可能的,因为你的黄瓜场景是在一个过程中运行的,并且通过浏览器进行交互 - 应用程序本身就在一个单独的领域。

我会做的是我会做一个类似这样的步骤:

And XYZ api endpoint is off

在此步骤中,您可以执行任何操作来禁用端点。例如,您可以ps aux | grep ...查找进程ID并将其终止。 (记得以后重新启动它,或者将And XYZ endpoint is on添加到" happy"场景中。

或者向本地运行的模拟服务发送请求,以便不处理下一个请求。

这个想法是本地运行的服务在你的控制之下(或者只是通过在同一台机器上运行 - 你可以杀死它,或者通过实现一些其他机制来允许你发送信号,所以它的行为就像它是错的)

答案 2 :(得分:0)

也许尝试使用VCR来记录api调用的失败响应。然后,您不必担心每次运行cuke时都会使端点失败。