Pytest Django函数模拟APITestCase

时间:2019-11-09 22:02:33

标签: python django django-rest-framework pytest pytest-django

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

我从pytest-mock和unittest.mock.patch中尝试了模拟器,每次在某个测试用例中模拟此函数时,它在其他测试中也同样被模拟。

第一个.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:值得注意的是,当我更改测试顺序时,第二个测试正确完成,但是第一个无法修补该方法并调用该方法未修复,因此失败。

1 个答案:

答案 0 :(得分:0)

我通过使用SimpleTestCase超类解决了该问题。我仍然不知道为什么会这样,但现在似乎不再如此。