Невозможно использовать attach_mock с фиктивной функцией autospec

Библиотечный модуль:

# mod.py
def foo():
    bar1("arg1")
    bar2("arg2x", "arg2y")

def bar1(x):
    pass

def bar2(x, y):
    pass

Тестовый модуль:

# test_mod.py
from mod import foo

def test_foo(mocker):
    mock = mocker.MagicMock()
    mock.attach_mock(mocker.patch("mod.bar1"), "b1")
    mock.attach_mock(mocker.patch("mod.bar2", autospec=True), "b2")
    foo()
    mock.assert_has_calls(
        [
            mocker.call.b1("arg1"),
            mocker.call.b2("arg2x", "arg2y"),
        ]
    )

mocker крепление от pytest-mock плагин. Выполнить MCVE с python -m pytest ,

Этот тест не проходит по странным причинам.

E       AssertionError: Calls not found.
E       Expected: [call.b1('arg1'), call.b2('arg2x', 'arg2y')]
E       Actual: [call.b1('arg1')]

Без автоспуска это работает. Использует ли AutoSpec сломать attach_mock особенность? Как пройти тест на foo отстаивать порядок и аргументы обращений к зависимостям bar1 а также bar2 не теряя автоспек?

0 ответов

На самом деле это была ошибка в Python. Исправлено в конце 2019 года, исправлены версии:

Тест в исходном посте сейчас проходит в исправленной версии. Нет бэкпорта для Python 3.6, который является безопасным только сейчас, поэтому он останется ошибочным навсегда.

Это связанные PR и ссылки для отслеживания проблем:

bpo-21478: функции Autospec должны распространять фиктивные вызовы на родительский

bpo-21478: записывать вызовы к родительскому объекту, когда автоматически заданные объекты используются как дочерние сattach_mock

bpo-38473: обрабатывать автоматически задаваемые функции и методы, используемые сattach_mock

Нашивка Картикеяна Сингаравелана.

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