Elixir ExUnit模拟在并发性中会混淆(异步:false不工作?)

Elixir ExUnit模拟在并发性中会混淆(异步:false不工作?),elixir,meck,Elixir,Meck,在执行ExUnit.start时,在每种情况下,我都会通过meck像下面这样准备模拟 defmodule MyModule.FooTest do 使用ExUnit.Case,async:false#显式同步 进口:墨西哥克 别名MyModule.Foo 别名MyModule.Baz#将被嘲笑 测试“call_baz”do expect(Baz,:某种异步方法[ {[],:meck.val(Task.async(fn->%{“name”=>“otai10”}end)}, ]) 断言Foo.call

在执行
ExUnit.start
时,在每种情况下,我都会通过
meck
像下面这样准备模拟

defmodule MyModule.FooTest do
使用ExUnit.Case,async:false#显式同步
进口:墨西哥克
别名MyModule.Foo
别名MyModule.Baz#将被嘲笑
测试“call_baz”do
expect(Baz,:某种异步方法[
{[],:meck.val(Task.async(fn->%{“name”=>“otai10”}end)},
])
断言Foo.call_baz()=%{“name”=>“otai10”}
结束
结束
但是它返回
{“name”=>“otai200”}
,因为
Baz。一些异步方法
另一个测试模仿,返回
{“name”=>“otai200”}

这当然是在另一个测试用例中模拟的结果。(它们在
use
语句中也给出了
async:false
选项)

问题是什么,
async:false
选项不起作用?或者是模拟
任务。不建议使用async
还是我犯了任何基本错误


谢谢

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

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


我建议尝试使用Meck Elixir包装器,看看这是否会给你同样的结果。

这是一个日志!我必须做两件事。首先,确保只模拟一个特定的方法,如
:Meck.new(Baz,[:passthrough])
。第二,正如你所说,
:Meck.unload
,以撕裂模拟。