我正在尝试模拟黄瓜测试中的外部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
?
答案 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时都会使端点失败。