У меня есть набор тестов Python, и я часто использую Mock / MagicMock в своих тестах. Недавно у меня был тест, в котором я хотел, чтобы смоделированная функция возвращала разные вещи в зависимости от того, сколько раз она была вызвана. Я думал, что это можно сделать, используя технику массива side_effect, обозначенную здесь . Кажется, работает, но есть проблема. Я создаю и исчерпываю массив side_effect в тесте A, и если тест B запускается после теста A, а также вызывает ту же функцию, я полагаю, что она ссылается на теперь смоделированную версию функции вместо реальной. Это вызывает неожиданную ошибку StopIteration
, поскольку тест B пытается извлечь из истощенного массива возвращаемых значений. Вот пример кода моей проблемы
class tests(unittest.TestCase):
def test_a():
myfile.myclassinstance.myfunction = MagicMock(side_effect=[1, 2, 3])
myfile.myclassinstance.myfunction() # returns 1
myfile.myclassinstance.myfunction() # returns 2
myfile.myclassinstance.myfunction() # returns 3
def test_b():
myfile.myclassinstance.myfunction() # StopIteration error raised if test_a runs first
Я думаю, что проблема связана с тем фактом, что оба теста ссылаются на один и тот же экземпляр класса (хотя я думал, что каждый тест выполнялся как «новый запуск»). Есть ли способ отменить издевательский метод? Вроде как reset_mock () ?
Также для получения некоторой дополнительной информации, независимо от запуска тестов, они проходят. Только когда эти тесты выполняются вместе, один сбой (B).