在执行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?还是我犯了什么基本的错误?
谢谢
发布于 2016-02-05 08:25:29
Meck需要显式卸载模拟。因此,在运行此测试时,另一个并行运行的测试可能会更新期望。尝试使用模拟将:meck.unload(Baz)添加到每个测试中。
我不太熟悉Elixir如何决定运行它的测试套件(可能是并行的,即使它们在内部是异步的?)所以这可能会影响到。由于Meck正在修改全局模块命名空间,因此不应该从不同的测试用例并行地模拟同一个模块。
我建议尝试使用Meck包装器模拟来验证这是否给出了相同的结果。
https://stackoverflow.com/questions/35215474
复制相似问题