在执行ExUnit.start
时,在每种情况下,我都会像meck
一样准备模拟,如下所述
defmodule MyModule.FooTest do
use ExUnit.Case, async: false # explicitly sync
import :meck
alias MyModule.Foo
alias MyModule.Baz # to be mocked
test "call_baz" do
expect(Baz, :some_async_method, [
{[], :meck.val(Task.async(fn -> %{"name" => "otiai10"} end)},
])
assert Foo.call_baz() == %{"name" => "otiai10"}
end
end
但它返回{"name" => "otiai200"}
,因为Baz.some_async_method
被另一个测试嘲笑而返回{"name" => "otiai200"}
。
这肯定是在另一个测试案例中嘲笑的回应。 (他们的async: false
声明中也有use
个选项
问题是什么,async: false
选项不起作用?或嘲笑Task.async
不推荐?或者我是否犯了任何基本错误?
谢谢
答案 0 :(得分:2)
Meck要求明确卸载模拟。因此,在运行此测试时,并行运行的另一个测试可能会更新期望值。尝试使用模拟将teardown中的:meck.unload(Baz)
添加到每个测试中。
我不熟悉Elixir如何决定运行它的测试套件(可能是并行的,即使它们在内部是异步的?)因此可能会考虑到这一点。因为Meck正在修改全局模块命名空间,你不应该从不同的测试用例中并行模拟同一个模块。
我建议尝试使用Meck包装器Mock进行Elixir,看看这是否会给你相同的效果。