Python补丁模仿不受尊重

2024-05-03 13:45:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在测试一段Python代码时遇到了一个我无法理解的问题。在下面的代码中,我测试了一个模块的方法,该方法在找到提交时应返回200,在找不到提交时应返回404。获取提交的方法是我正在测试的模块的外部方法,因此必须在测试中模拟它。你知道吗

当下面的代码运行时,第二个测试失败,因为返回的状态代码是200。当我打印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 AssertionError: 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: 我在analysis_get中打印了Submissions,发现两个测试都使用了相同的模拟

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

Tags: testselfsubmissiongetreturnvaluelibdef
1条回答
网友
1楼 · 发布于 2024-05-03 13:45:36

上面代码中的问题是,我假设每个测试都可以通过在每个测试中声明from api import analysis来导入它自己的analysis模块的新版本。实际上,这只是第一次导入analysis,而不是随后导入。由于只有一个导入,只有第一个mock\u提交被修补到类中,因为Submissionsanalysis模块中的有状态组件。解决方案是编辑代码以使用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)

相关问题 更多 >