Python Unittest не изолирует патчи при запуске тестов - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть два теста, каждый из которых создает разные исправления для возвращаемого значения метода, используемого в моем коде.Когда я запускаю тесты отдельно, они проходят.Если я запускаю их вместе, я вижу, что unittest использует неправильный патч для второго теста.

Я пытался использовать синтаксис декоратора для патча, я даже пытался изменить тесты на pytest,Я также попытался запустить тесты с носом.Я сталкиваюсь с той же проблемой: второй тест получает результат «foo» вместо «bar».

Есть ли способ запустить тесты последовательно?Что я здесь пропустил?Можем ли мы предположить, что я не могу изменить классы, которые я тестирую, например, используя внедрение зависимостей вместо исправлений.Давайте предположим, что мне нужно использовать исправления.

import unittest
from unittest.mock import patch
from unittest.mock import MagicMock
class TestMember(unittest.TestCase):
    def setUp(self):
        pass

    def test_1(self):
        test_json = {
            "something-123": []
        }

        mock = MagicMock()
        mock.return_value = test_json
        with patch('imported_module.get_json', mock):
            from some_module import some_method
            result = some_method()
            self.assertEqual(result, "foo")

    def test_2(self):
        test_json = {
            "something-else-123": []
        }

        mock = MagicMock()
        mock.return_value = test_json
        with patch('imported_module.get_json', mock):
            from some_module import some_method
            result = some_method()
            self.assertEqual(result, "bar")

if __name__ == '__main__':
    unittest.main()

Класс, который я тестирую:

from imported_module import get_json

def some_method():
    json_obj = get_json()
    if "something-123" in json_obj.keys():
        return "foo"
    else:
        return "bar"

и для полноты вот код import_module:

def get_json():
    return {}

1 Ответ

0 голосов
/ 20 декабря 2018

Вам нужно исправить get_json там, где он используется (some_module), а не там, где он определен (imported_module).Это потому, что patch() исправляет имя , используемое тестируемым кодом.

Если вы обновите patch(), чтобы выполнить это, тогда тесты пройдут, как и ожидалось:

with patch('some_module.get_json', mock):

Больше информации о том, где патчить здесь .

...