Pytest Django 函数模拟 APITestCase

Pytest Django function mocking APITestCase

我正在尝试创建涉及使用 pytest-django 向我的 API 发送 GET 请求的测试,我需要一个在要模拟的视图中使用的函数。

我已经尝试过 pytest-mock 和 unittest.mock.patch 中的 mocker,每次我在某些测试用例中模拟这个函数时,它在其他测试中也会被模拟。

第一个 .py 测试文件:

from unittest.mock import patch
from rest_framework.test import APITestCase
import pytest

@pytest.mark.django_db
class TestFirst(APITestCase):
    @classmethod
    def setUpClass(cls):
        cls.patcher = patch(app.views.function)
        cls.patcher.start()

    @classmethod
    def tearDownClass(cls):
        cls.patcher.stop()

    def test_something(self):
        get_data = self.client.get('/some/url')
        self.assertEqual(200, get_data.status_code)

然后在一些完全不同的 .py 文件中进行测试:

from rest_framework.test import APITestCase
import pytest

@pytest.mark.django_db
class TestSecond(APITestCase):
    def test_something_else(self):
        get_data = self.client.get('/some/url')
        self.assertEqual(200, get_data.status_code)

在调试第一个测试用例时,方法打补丁正确。然而,当 运行 第二次测试时,该方法仍保持修补状态,模拟对象保持接收到的调用数。

我是不是漏掉了什么重要的东西?

编辑:我尝试同时修补定义方法的文件和视图中方法的名称,但总是得到相同的结果。

EDIT2:值得注意的是,当我更改测试顺序时,第二个测试正确完成,但第一个无法修补该方法并将其称为未修补,因此失败。

我使用 SimpleTestCase 超类解决了这个问题。我仍然不知道为什么会这样,但似乎不再是了。