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

Bow*_*ser 6 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)
Run Code Online (Sandbox Code Playgroud)

在我的第二个测试用例test_delete_stuff中,我在实际代码中添加了一个print语句,以便调试正在抛出的错误.事实证明,通过url命中控制器动作中的一个函数调用返回一个MagicMock对象!它是来自之前测试用例的mock_b.

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

附加信息:类上没有这些实例方法所在的修补程序装饰器.

有任何想法吗?

--UPDATE--

事实证明,我没有在他们被查找的地方模拟我的函数调用,这解决了问题.但是,它没有解释为什么补丁的范围超过了一个测试用例.

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

Max*_*x V 1

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

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

所以所有带有前缀的方法test都会被补丁修饰。这是默认行为。

  • 确切地。这明确表明他们没有使用补丁装饰器作为类装饰器。 (2认同)