Я использую библиотеку Mock для тестирования своего приложения, но хочу заявить, что какая-то функция не была вызвана. В макетных документах говорится о таких методах, как mock.assert_called_with
и mock.assert_called_once_with
, но я не нашел ничего похожего mock.assert_not_called
или чего-то связанного с проверкой, что макет НЕ был вызван .
Я мог бы пойти с чем-то вроде следующего, хотя это не кажется крутым или питоническим:
def test_something:
# some actions
with patch('something') as my_var:
try:
# args are not important. func should never be called in this test
my_var.assert_called_with(some, args)
except AssertionError:
pass # this error being raised means it's ok
# other stuff
Есть идеи, как это сделать?
python
unit-testing
mocking
python-mock
Gerard
источник
источник
Ответы:
Это должно работать в вашем случае;
Образец;
источник
AttributeError: MockCallable instance has no attribute 'called'
sudo easy_install -U mock
иfrom mock import Mock
на MacOS все вышеперечисленное работает без сбоев. Никогда не устанавливал Django :)from mock import Mock
Python Mock 0.1.0 для своих тестов. Что-нибудь из этого звучит проблематично?module_to_test.another_module.class = mock.Mock()
, вы можете подтвердить, что он не запоминает вызовы в разных тестовых случаях (экземпляры unittest.TestCase)? Я думаю, что в этом случае счетчик звонков не сбрасываетсяХотя это старый вопрос, я хотел бы добавить, что в настоящее время
mock
библиотека (backport of unittest.mock) поддерживаетassert_not_called
метод.Просто обновите свой;
pip install mock --upgrade
источник
Вы можете проверить
called
атрибут, но если ваше утверждение терпит неудачу, следующее, что вам нужно знать, это что-то о неожиданном вызове, поэтому вы также можете организовать отображение этой информации с самого начала. Используяunittest
, вы можетеcall_args_list
вместо этого проверить содержимое :В случае сбоя выдает следующее сообщение:
источник
Когда вы тестируете, используя класс, наследующий unittest.TestCase, вы можете просто использовать такие методы, как:
и тому подобное ( остальное вы найдете в документации Python ).
В вашем примере мы можем просто утверждать, имеет ли свойство mock_method.called значение False , что означает, что метод не был вызван.
источник
С помощью
python >= 3.5
можно использоватьmock_object.assert_not_called()
.источник
Судя по другим ответам, никто, кроме @ rob-kennedy, не говорил о
call_args_list
.Это мощный инструмент, позволяющий реализовать прямо противоположное
MagicMock.assert_called_with()
call_args_list
это списокcall
объектов. Каждыйcall
объект представляет собой вызов фиктивного вызываемого объекта.Использовать
call
объект легко, так как вы можете сравнить его с кортежем длиной 2, где первый компонент - это кортеж, содержащий все позиционные аргументы связанного вызова, а второй компонент - словарь аргументов ключевого слова.Итак, способ решения конкретной проблемы OP -
Обратите внимание, что таким образом, вместо того, чтобы просто проверять, был ли вызван фиктивный вызываемый объект через
MagicMock.called
, теперь вы можете проверить, был ли он вызван с определенным набором аргументов.Это полезно. Допустим, вы хотите протестировать функцию, которая принимает список и вызывает другую функцию
compute()
, для каждого значения списка, только если они удовлетворяют определенному условию.Теперь вы можете поиздеваться
compute
и проверить, было ли вызвано какое-то значение, а не другое.источник