Мокеры ExUnit перепутаны в их параллелизме (async: false не работает?)
Во время выполнения 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 ответ
Мек требует явной выгрузки макетов. Следовательно, возможно, что другой параллельный тест обновит ожидание во время выполнения этого теста. Попробуйте добавить :meck.unload(Baz)
в разборке каждого теста с помощью макета.
Я не знаком с тем, как Elixir решает запустить свои тестовые наборы (возможно, параллельно, даже если они внутренне асинхронны?), Так что это может учитываться. Поскольку Мекк изменяет глобальное пространство имен модуля, вы не должны насмехаться над тем же модулем в параллельно из разных тестовых случаев.
Я бы посоветовал попробовать использовать Meck-упаковщик Mock для эликсира, чтобы увидеть, дает ли это тот же результат.