ExUnit 模拟序列
ExUnit mock sequence
是否可以像 meck 在 Erlang 中提供此功能一样使用 ExUnit Mock 模拟一系列 return 值?
...
meck:new(my_module),
meck:sequence(my_module, method, 1, [Response1, Response2]),
meck:unload(module),
...
如果不是,是否可以在同一个单元测试 ExUnit Elixir 模块中成功组合 meck 和 mock?
mock.ex
中没有提到 :meck.sequence
,所以我猜这还不受支持。
直接调用 :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
是否可以像 meck 在 Erlang 中提供此功能一样使用 ExUnit Mock 模拟一系列 return 值?
...
meck:new(my_module),
meck:sequence(my_module, method, 1, [Response1, Response2]),
meck:unload(module),
...
如果不是,是否可以在同一个单元测试 ExUnit Elixir 模块中成功组合 meck 和 mock?
mock.ex
中没有提到 :meck.sequence
,所以我猜这还不受支持。
直接调用 :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