ExUnit模拟混淆了它们的并发性(异步:false不工作?)

时间:2016-02-05 02:46:10

标签: elixir meck

在执行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不推荐?或者我是否犯了任何基本错误?

谢谢

1 个答案:

答案 0 :(得分:2)

Meck要求明确卸载模拟。因此,在运行此测试时,并行运行的另一个测试可能会更新期望值。尝试使用模拟将teardown中的:meck.unload(Baz)添加到每个测试中。

我不熟悉Elixir如何决定运行它的测试套件(可能是并行的,即使它们在内部是异步的?)因此可能会考虑到这一点。因为Meck正在修改全局模块命名空间,你不应该从不同的测试用例中并行模拟同一个模块。

我建议尝试使用Meck包装器Mock进行Elixir,看看这是否会给你相同的效果。