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

时间:2014-10-17 19:42:33

标签: python unit-testing mocking 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命中控制器动作中的一个函数调用返回一个MagicMock对象!它来自之前的测试用例的mock_b。

如果我只是颠倒两个测试用例的顺序,则没有任何变化。如果我用修补程序装饰器注释掉那个,我的第二个测试用例就会通过。

其他信息: 这些实例方法所在的类上没有补丁装饰器。

有什么想法吗?

- UPDATE -

事实证明,我并没有模仿我的函数调用from where they were being looked up,这解决了这个问题。但是,它没有解释为什么补丁的范围超过了一个测试用例。

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

1 个答案:

答案 0 :(得分:2)

我猜想路径范围的问题已经出现,因为您在TestCase类中修补了方法。您可以在the official Python unittest.patch documentation中找到

修补程序可以用作TestCase类装饰器。它通过装饰类中的每个测试方法来工作。当您的测试方法共享一个通用补丁集时,这会减少样板代码。 patch()通过查找以patch.TEST_PREFIX开头的方法名称来查找测试。默认情况下,这是“ test”,与unittest查找测试的方式匹配。您可以通过设置patch.TEST_PREFIX来指定备用前缀。

因此所有前缀为test的方法都将使用补丁进行修饰。这是默认行为。