1

是否可以使用 ExUnit Mock 模拟一系列返回值,就像 meck 在 Erlang 中提供此功能一样?

...
meck:new(my_module),
meck:sequence(my_module, method, 1, [Response1, Response2]),
meck:unload(module),
...

如果没有,是否可以在同一个单元测试 ExUnit Elixir 模块中成功结合 meck 和 mock?

4

1 回答 1

2

没有提到:meck.sequenceinmock.ex所以我猜这还不支持。

直接调用函数应该没问题:meck,只要它在Mock.with_mock调用之外并且确保:meck.unload/1在完成后调用。(并且您使用async: false,因为 Mock 已经需要。)即使在同一个测试中也应该没问题。

test "the truth" do
  url = "http://www.google.com"

  :meck.new(HTTPoison)
  :meck.sequence(HTTPoison, :get!, 1, [%{body: "foo"}, %{body: "bar"}])
  assert HTTPoison.get!(url).body == "foo"
  assert HTTPoison.get!(url).body == "bar"
  assert HTTPoison.get!(url).body == "bar"
  :meck.unload(HTTPoison)

  assert HTTPoison.get!(url).body =~ "HTML"

  with_mock HTTPoison, [get!: fn(_url) -> %{body: "baz"} end] do
    assert HTTPoison.get!(url).body == "baz"
  end

  assert HTTPoison.get!(url).body =~ "HTML"
end

演示:

$ mix test
.

Finished in 0.2 seconds
1 test, 0 failures
于 2016-08-04T15:57:14.213 回答