сделать Mock.assert_called_with () независимым от аргументов args и kwargs - PullRequest
10 голосов
/ 05 февраля 2012

Модульные тесты должны проверять функциональность и пытаться не зависеть от деталей реализации.Mock.assert_called_with() - удобная функция, но AFAIK сравнивает *args с *args и **kwargs с **kwargs.Следовательно:

# class to be mocked during test
class SomeClass():
    def func(self,a,b,c=5):
        # ...

# code under test
somaclass_instance.func(1,b=2,c=3)

# test code that works
someclass_mock.func.assert_called_with(1,b=2,c=3)

# test code that won't work
someclass_mock.func.assert_called_with(1,2,c=3)
someclass_mock.func.assert_called_with(a=1,b=2,c=3)

есть способ обобщить это так, что особенности, которые *args, где используется как **kwargs в вызове func, который действительно является деталью реализации, будутигнорировали?

Ответы [ 2 ]

5 голосов
/ 06 февраля 2012

Подать запрос на фиктивную функциюидентичен mock, в то время как вызовы call(1, 2) и call(2, 1) этого не делают.

Если вы хотите обобщить mock, вам потребуется передать прототип вызова или функцию вместо прототипа, например:

amock.afunc.assert_called_with(1, 2, c=3, __prototype__=lambda a=None, b=None, c=None: None)
1 голос
/ 17 августа 2017

Начиная с Python 3.4, как вы и хотели, утверждение для конкретных сигнатур вызовов нормализуется автоматически, когда вызываемый Mock создается со спецификацией, и для объектных методов при использовании автоматической спецификации.

С самого конца документация класса Mock :

вызываемый макет, который был создан с помощью спецификации (или spec_set) будет анализировать сигнатуру объекта спецификации при сопоставлении вызовов издеваться Следовательно, он может соответствовать фактическим аргументам вызова. независимо от того, были ли они переданы позиционно или по имени:

>>> def f(a, b, c): pass
...
>>> mock = Mock(spec=f)
>>> mock(1, 2, c=3)
<Mock name='mock()' id='140161580456576'>
>>> mock.assert_called_with(1, 2, 3)
>>> mock.assert_called_with(a=1, b=2, c=3)

Это относится к assert_called_with (), assert_called_once_with (), assert_has_calls () и assert_any_call (). Когда Autospeccing, это будет также применяется к вызовам методов для фиктивного объекта.

Изменено в версии 3.4: добавлен сигнатурный самоанализ для фиктивных и автоматически определяемых фиктивных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...