【问题标题】:Stub / override a controller method in a cucumber test?在黄瓜测试中存根/覆盖控制器方法?
【发布时间】:2018-01-24 17:25:55
【问题描述】:

我正在尝试在黄瓜测试中模拟外部 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

【问题讨论】:

  • 因为请求是从与黄瓜测试不同的进程执行的,所以它们不共享相同的内存。您不能像在单元测试中那样对它进行存根。您必须找到另一种方法来使您的 API 调用失败。
  • 在 Java 中,我们可以使用 MockServer 或 WireMock 来模拟(实际上是存根)外部服务。 Ruby 有没有类似的工具?

标签: ruby-on-rails rspec cucumber


【解决方案1】:

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

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

And XYZ api endpoint is off

在此步骤中,您可以执行任何您必须执行的操作来禁用端点。例如,您可以ps aux | grep ... 找到一个进程 id 并将其杀死。 (记得之后重新启动它,或者将And XYZ endpoint is on添加到“快乐”场景中)。

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

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

【讨论】:

    【解决方案2】:

    也许可以尝试使用VCR 记录对 api 调用的失败响应。这样您就不必担心每次运行 cuke 时都会导致端点失败。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多