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 看看这是否会给您相同的结果。