Мокеры 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 для эликсира, чтобы увидеть, дает ли это тот же результат.

Другие вопросы по тегам