Python补丁装饰器溢出到其他方法中

问题描述 投票:7回答:1

我的理解是,当你在单元测试上使用补丁装饰器时(我使用的是nose框架),该补丁装饰器的范围就是测试用例的范围。问题是这样的。

@patch('a')
@patch('b')
@patch('b')
def test_add_stuff(self, mock_a, mock_b, mock_c):
    url = '/path/blah/blah'
    assert_true(stuff)
    # Now those three patch decorators should be "done"


def test_delete_stuff(self):
    url = '/another_path/not_important'
    assert_true(something)

在我的第二个测试用例test_delete_stuff中,我在实际代码中添加了一个print语句,以调试一个正在抛出的错误。结果发现,通过url打出的controller动作中的一个函数调用正在返回一个MagicMock对象! 就是之前测试用例中的mock_b。

如果我简单地将两个测试用例的顺序颠倒过来,没有任何变化。如果我注释掉有补丁装饰符的那个,我的第二个测试用例就能通过。

额外的信息:这些实例方法所在的类上没有补丁装饰符。

有什么想法吗?

--UPDATE--

事实证明,我没有模拟我的函数调用 仰望的地方这就解决了这个问题,但它并没有解释为什么补丁的范围超过了一个测试用例。然而,它并不能解释为什么补丁的范围超过了一个测试用例。

如果控制器只有在使用app.get发送GET请求时才会被实例化,而控制器文件中的导入会被模拟,为什么MagicMock对象会在多个单元测试中持续存在?

python unit-testing mocking nose
1个回答
1
投票

我猜想路径范围的问题已经出现了,因为你在测试用例中修补了方法。TestCase 类。你可以在 官方的Python unittest.patch 文件:

补丁可以作为TestCase类的装饰器。它通过装饰类中的每个测试方法来工作。patch() 通过寻找以 patch.TEST_PREFIX 开头的方法名来查找测试。默认情况下,这是'test',这与 unittest 查找测试的方式一致。你可以通过设置 patch.TEST_PREFIX 来指定一个替代的前缀。

因此,所有前缀为 test 将被装饰成补丁。这是默认的行为。

© www.soinside.com 2019 - 2024. All rights reserved.