Обычно меня не волнует порядок звонков, только то, что они произошли. В этом случае я комбинирую assert_any_call
с утверждением о call_count
.
>>> import mock
>>> m = mock.Mock()
>>> m(1)
>>> m(2)
>>> m(3)
>>> m.assert_any_call(1)
>>> m.assert_any_call(2)
>>> m.assert_any_call(3)
>>> assert 3 == m.call_count
>>> m.assert_any_call(4)
Traceback (most recent call last):
File "", line 1, in
File "[python path]\lib\site-packages\mock.py", line 891, in assert_any_call
'%s call not found' % expected_string
AssertionError: mock(4) call not found
Я считаю, что это делается проще читать и понимать, чем большой список вызовов, переданных в один метод.
Если вы заботитесь о порядке или ожидаете несколько идентичных вызовов, assert_has_calls
может быть более уместным .
Поскольку я опубликовал этот ответ, я переосмыслил свой подход к тестированию в целом. Я думаю, что стоит упомянуть, что если ваш тест усложняется, вы можете испытывать неуместно или иметь проблемы с дизайном. Mocks предназначены для тестирования межобъектной связи в объектно-ориентированном дизайне. Если ваш дизайн не ориентирован на возражения (как в более процедурном или функциональном), макет может быть совершенно неуместным. Возможно, вы слишком много работаете внутри метода, или вы можете тестировать внутренние детали, которые лучше всего оставить незафиксированными. Я разработал стратегию, упомянутую в этом методе, когда мой код был не очень объектно-ориентированным, и я считаю, что я также тестировал внутренние детали, которые лучше всего оставить незафиксированными.
Я ожидаю, что ваш класс Event
содержит свойство User
, которое затем добавляет не только пользователя, но и события этого пользователя. Поскольку событие, в котором находится пользователь, также означает, что пользователь находится в этом событии, у вас есть бесконечный цикл. Поскольку событие добавляет пользователя, который, в свою очередь, добавляет событие, которое, в свою очередь, добавляет пользователя, который добавляет событие, ... до тех пор, пока стек не переполнится.
Чтобы предотвратить переполнение стека, либо удалите вложение либо пользователей в событии, либо события в пользователях, либо не записывайте его в базу данных, пометив его как @Exclude
.