Python Unittest макет итеративный перетекание в другие тесты? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть набор тестов 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).

...