requests_mock 单元测试库的夹具?

requests_mock fixture with unittest library?

我需要模拟 requests 库,因此想为此使用 requests_mock 库。虽然我想知道如何在使用 unittest 库时为我的测试 class 创建夹具?

我可以用 testtools 做到这一点,比如:

import testtools
from requests_mock.contrib import fixture

class MyTestCase(testtools.TestCase):
    TEST_URL = 'http://some-not-existing-url.com'

    def setUp(self):
        super().setUp()
        self.requests_mock = self.useFixture(fixture.Fixture())
        self.requests_mock.post(self.TEST_URL, status_code='200')

    def test_01_method(self):
        resp = requests.post(self.TEST_URL)
        self.assertEqual('200', resp.status_code)

现在unittest没有useFixture方法。 unittest 库中是否有一些等价物?或者我需要在那里使用一些不同的方法?

正在尝试类似的事情(没有 useFixture、崩溃测试):

import unittest
from requests_mock.contrib import fixture

class MyTestCase(unittest.TestCase):
    TEST_URL = 'http://some-not-existing-url.com'

    def setUp(self):
        super().setUp()
        self.requests_mock = fixture.Fixture()
        self.requests_mock.post(self.TEST_URL, status_code='200')

    def test_01_method(self):
        resp = requests.post(self.TEST_URL)
        self.assertEqual('200', resp.status_code)

运行 unittest,我得到 [Errno -2] Name or service not known,这清楚地表明模拟没有正确应用。

P.S。我需要 unittest lib,因为它在我使用的框架中使用。所以我需要合并这些单元测试以与该框架保持一致。

您可以在 setUp 中显式启动模拟并在 tearDown 中停止它,而不是使用夹具。

例如:

import unittest
import requests_mock
import requests

class MyTestCase(unittest.TestCase):
    TEST_URL = 'http://some-not-existing-url.com'

    def setUp(self):
        super().setUp()
        self.requests_mock = requests_mock.Mocker()
        self.requests_mock.post(self.TEST_URL, status_code='200')
        self.requests_mock.start()

    def test_01_method(self):
        resp = requests.post(self.TEST_URL)
        self.assertEqual('200', resp.status_code)

    def tearDown(self):
        super().tearDown()
        self.requests_mock.stop()