2

在执行时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不推荐嘲笑?还是我犯了任何基本错误?

谢谢

4

1 回答 1

2

Meck 需要显式卸载模拟。因此,在您运行此测试时,另一个并行运行的测试可能会更新预期。尝试:meck.unload(Baz)使用模拟将拆解添加到每个测试中。

我不熟悉 Elixir 如何决定运行它的测试套件(可能是并行的,即使它们在内部是异步的?)所以这可能是一个因素。由于 Meck 正在修改全局模块命名空间,你不应该在平行于不同的测试用例。

我建议尝试使用 Meck wrapper Mock for Elixir 看看这是否会给你同样的结果。

于 2016-02-05T08:25:29.330 回答