【问题标题】:In Elixir how to mock temporary failures在 Elixir 中如何模拟临时失败
【发布时间】:2017-10-27 16:46:09
【问题描述】:

我正在使用 Mox 模拟 HTTP 调用(使用 Tesla),如下所示:

  test "Token expiry is handled by re-applying for a token on the fly", %{conn: conn} do
    TeslaMock
    |> expect(:call, 8, fn env, _opts ->
      case env.url do
        "http://fake.server.com/v1/token" ->
          %{env | status: 200, body: Poison.encode!(
                     %{token_type: "Bearer",
                     access_token: "cHBtKbMDNdc3uX2LIhCy9eVwkodhEc87s6e5Fk0lRS",
                     expires_in: 86400})
          }
        "http://fake.server.com/v1/system" ->
          %{env | status: 200, body: Poison.encode!(%{uptime: 10})}
      end
    end)

    assert json_response(get(conn, "/v1/system"), 200) == %{"uptime" => 10}

我需要fake server先回复:401 token expired to /v1/system,我的Module发出/v1/token,然后重试/v1/system成功。 有什么好的方法可以做到这一点?

【问题讨论】:

  • 哪个网址应该先返回 401?
  • 我编辑了这个问题。但我觉得你要去哪里..

标签: elixir ex-unit


【解决方案1】:

您可以使用Agent 来跟踪已向/v1/system 发出的请求数。然后,如果是第一个请求,则返回 401,否则返回 200。

{:ok, counter} = Agent.start_link(fn -> 0 end)

TeslaMock
|> expect(:call, 8, fn env, _opts ->
  case env.url do
    "http://fake.server.com/v1/token" ->
      ...
    "http://fake.server.com/v1/system" ->
      # Increment the counter.
      Agent.update(counter, &(&1 + 1))
      if Agent.get(counter, &(&1)) == 1 do
        # First request.
        %{env | status: 401, body: ...}
      else
        # Second or later request.
        %{env | status: 200, body: Poison.encode!(%{uptime: 10})}
      end
  end
end)

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多