Невозможно использовать 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
Нашивка Картикеяна Сингаравелана.