ExUnit 模拟在他们的并发中混淆(异步:false 不工作?)
ExUnit mocks get mixed up in their concurrency (async: false not working?)
在执行 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
但它 returns {"name" => "otiai200"}
,因为 Baz.some_async_method
被 另一个测试 嘲笑并返回 {"name" => "otiai200"}
.
肯定是另一个测试用例中mock的响应。 (他们在 use
声明中也有 async: false
选项)
有什么问题,async: false
选项不起作用?还是不推荐嘲笑 Task.async
?或者我是否犯了任何基本错误?
谢谢
Meck 需要显式卸载模拟。因此,在您 运行ning 进行此测试时,另一个并行测试 运行ning 可能会更新预期。尝试在使用模拟的每个测试的拆解中添加 :meck.unload(Baz)
。
我不熟悉 Elixir 如何决定 运行 它的测试套件(也许是并行的,即使它们在内部是异步的?)所以这可能会影响。因为 Meck 正在修改全局模块名称空间, 你不应该从不同的测试用例中并行模拟同一个模块。
我建议尝试使用 Elixir 的 Meck 包装器 Mock 看看这是否会给您相同的结果。
在执行 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
但它 returns {"name" => "otiai200"}
,因为 Baz.some_async_method
被 另一个测试 嘲笑并返回 {"name" => "otiai200"}
.
肯定是另一个测试用例中mock的响应。 (他们在 use
声明中也有 async: false
选项)
有什么问题,async: false
选项不起作用?还是不推荐嘲笑 Task.async
?或者我是否犯了任何基本错误?
谢谢
Meck 需要显式卸载模拟。因此,在您 运行ning 进行此测试时,另一个并行测试 运行ning 可能会更新预期。尝试在使用模拟的每个测试的拆解中添加 :meck.unload(Baz)
。
我不熟悉 Elixir 如何决定 运行 它的测试套件(也许是并行的,即使它们在内部是异步的?)所以这可能会影响。因为 Meck 正在修改全局模块名称空间, 你不应该从不同的测试用例中并行模拟同一个模块。
我建议尝试使用 Elixir 的 Meck 包装器 Mock 看看这是否会给您相同的结果。