Исправленный Python макет не соблюдается - PullRequest
0 голосов
/ 01 февраля 2019

Я столкнулся с проблемой при тестировании фрагмента кода Python, которую я просто не могу понять.В следующем коде я тестирую метод модуля, который должен возвращать 200, когда отправка найдена, и 404, когда отправка не найдена.Метод, который получает отправку, является внешним по отношению к модулю, который я тестирую, поэтому он должен быть смоделирован в тесте.

При выполнении приведенного ниже кода второй тест завершается неудачно, поскольку возвращаемый код состояния равен 200. Когда яprint analysis_result печатает макетированное значение для get_single_submission, предоставленное в первом тесте.Если я закомментирую первый тест, набор тестов пройдет нормально.Буду признателен за любые идеи или пожелания, которые могут быть у людей!

Тестовый код:

class AnalysisTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        pass

    @classmethod
    def tearDownClass(cls):
        pass

    def setUp(self):
        pass

    def tearDown(self):
        pass

    @mock.patch('lib.retention.Submissions')
    @mock.patch('lib.retention.Analysis')
    def test_analysis_get_submission(self, mock_Analysis, mock_Submissions):
        mock_Submissions.return_value.get_single_submission.return_value = Submission(
            md5="md5",
            analyze_completed="01-23-12"
        )

        from api import analysis
        test_event = {
            "pathParameters": {
                "query": ["test"],
                "id": 1
            }
        }

        analysis_result = analysis.analysis_get(test_event)
        print(analysis_result)

        self.assertEqual(analysis_result["statusCode"], 200)

    @mock.patch('lib.retention.Submissions')
    @mock.patch('lib.retention.Analysis')
    def test_analysis_get_submission_not_found(self, mock_Analysis, mock_Submissions):
        mock_Submissions.return_value.get_single_submission.return_value = None

        from api import analysis
        test_event = {
            "pathParameters": {
                "query": ["test"],
                "id": 1
            }
        }

        analysis_result = analysis.analysis_get(test_event)
        print("not found")
        print(analysis_result)

        self.assertEqual(analysis_result["statusCode"], 404)

И результат тестирования:

@mock.patch('lib.retention.Submissions')
@mock.patch('lib.retention.Analysis')
def test_analysis_get_submission_not_found(self, mock_Analysis, mock_Submissions):
    mock_Submissions.return_value.get_single_submission.return_value = None

    from api import analysis
    test_event = {
        "pathParameters": {
            "query": ["test"],
            "id": 1
        }
    }

    analysis_result = analysis.analysis_get(test_event)
    print("not found")
    print(analysis_result)
  self.assertEqual(analysis_result["statusCode"], 404)

EОшибка Assertion: 200! = 404

api/tests/analysis_test.py:72: AssertionError
------------------------------------------------------------------------------- Captured stdout call --------------------------------------------------------------------------------
not found
{'statusCode': 200, 'isBase64Encoded': False, 'headers': {'Content-Type': 'application/json'}, 'body': '{\n "metadata": {\n  "md5": "md5",\n  "analyzed_date": "01-23-12"\n }\n}'}

ОБНОВЛЕНИЕ: Файловая структура

project/lib/retention.py
       /api/analysis.py
           /tests/analysis_test.py

ОБНОВЛЕНИЕ 2: Я распечатал Submissions в analysis_get и нашел то же самоекак-то используется в обоих тестах

<MagicMock name='Submissions' id='4599620440'>

1 Ответ

0 голосов
/ 02 февраля 2019

Проблема в приведенном выше коде заключается в том, что я предполагал, что каждый тест может импортировать свою собственную свежую версию модуля analysis, указав from api import analysis в каждом тесте.На самом деле, это только импорт analysis в первый раз, а не впоследствии.Из-за единственного импорта в класс был вставлен только первый mock_Submissions, поскольку Submissions является компонентом с состоянием в модуле analysis.Решение состоит в том, чтобы отредактировать код для использования пакета reload для перезагрузки импорта в каждом тесте.

from importlib import reload
class AnalysisTest(unittest.TestCase):

@classmethod
@mock.patch('lib.retention.Submissions')
@mock.patch('lib.retention.Analysis')
def setUpClass(cls):
    from api import analysis

@classmethod
def tearDownClass(cls):
    pass

def setUp(self):
    pass

def tearDown(self):
    pass

@mock.patch('lib.retention.Submissions')
@mock.patch('lib.retention.Analysis')
def test_analysis_get_submission(self, mock_Analysis, mock_Submissions):
    mock_Submissions.return_value.get_single_submission.return_value = Submission(
        md5="md5",
        analyze_completed="01-23-12"
    )

    from api import analysis
    reload(analysis)
    test_event = {
        "pathParameters": {
            "query": ["test"],
            "id": 1
        }
    }

    analysis_result = analysis.analysis_get(test_event)
    print(analysis_result)

    self.assertEqual(analysis_result["statusCode"], 200)

@mock.patch('lib.retention.Submissions')
@mock.patch('lib.retention.Analysis')
def test_analysis_get_submission_not_found(self, mock_Analysis, mock_Submissions):
    mock_Submissions.return_value.get_single_submission.return_value = None

    from api import analysis
    reload(analysis)
    test_event = {
        "pathParameters": {
            "query": ["test"],
            "id": 1
        }
    }

    analysis_result = analysis.analysis_get(test_event)
    print("not found")
    print(analysis_result)

    self.assertEqual(analysis_result["statusCode"], 404)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...