【问题标题】:Force Hackney request timeout in test在测试中强制哈克尼请求超时
【发布时间】:2018-09-21 20:40:43
【问题描述】:

我正在寻找一种能够在我的一个控制器测试中重现 Hackney HTTP POST 请求超时的方法。我也在使用 ExVCR,但这似乎也不允许您强制请求超时。

我尝试在发出请求时将 Hackney 超时设置为 1,但它超时了,但我不想在测试中实际发出请求。

我愿意使用模拟/存根,但要确保我仍然可以在单元测试中使用 ExVCR,这些单元测试实际上向我正在集成的服务发出请求。我见过的所有模拟库和模式都将整个模块用于整个测试环境,这不是我想要的。

这是我提出的请求的示例:

:hackney.post(url, [timeout: 1], body, get_auth())

我希望它返回 {:error, :timeout},这是 Hackney 在真实超时场景中返回的内容。

【问题讨论】:

  • 如果你使用mock,你可以只在一个测试中模拟一个函数,你也有一个passthrough选项,这样所有不匹配指定的请求都会进入模块。跨度>

标签: elixir phoenix-framework ex-unit


【解决方案1】:

如果我对问题的理解正确,您希望 :hackney 在测试期间超时

  • 如果您不想进行查询,最好创建一个在测试和生产之间执行不同代码的宏。

  • 如果您想创建一个可以强制超时的服务器:您可以使用Plug.Router 模块创建一个需要一些时间来响应的路由器。

例如下面的代码:

defmodule MyRouter do 
   use Plug.Router 
   plug(:match)
   plug(:dispatch)

   post _ do 
     :timer.sleep(2000)
    send_resp(conn, 200, "ok")
   end
end

一定要使用Plug.Adapters.Cowboy.child_spec(:http, MyRouter, [], [port: 4000])命令启动路由器

您可以使用:hackney 命令查询地址为127.0.0.1:4000/ 的服务器。

希望我正确理解了这个问题

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多