Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python补丁修饰符溢出到其他方法中_Python_Unit Testing_Mocking_Nose - Fatal编程技术网

Python补丁修饰符溢出到其他方法中

Python补丁修饰符溢出到其他方法中,python,unit-testing,mocking,nose,Python,Unit Testing,Mocking,Nose,我的理解是,当您在单元测试中使用补丁装饰器时(我使用的是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

我的理解是,当您在单元测试中使用补丁装饰器时(我使用的是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

如果我简单地颠倒两个测试用例的顺序,则不会发生任何变化。如果我用补丁修饰符注释掉一个,我的第二个测试用例就通过了

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

有什么想法吗

--更新--

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


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

我猜路径范围的问题已经出现,因为您修补了
TestCase
类中的方法。您可以在以下网址找到:

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


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

如果可以显示所有代码,那就更好了。这当然让人觉得模仿会产生一些全球性的副作用。一些缓存或单例…@JanusTroelsen你能用重现问题所需的最短代码来改进问题吗?Bowser将其用作方法装饰器,而不是类装饰器。他实际上使用的是类,因为问题中有一句话:>附加信息:这些实例方法所在的类上没有补丁装饰程序。这明确表示他们没有使用补丁装饰器作为类装饰器。