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对象会通过多个单元测试持续存在?
我猜想路径范围的问题已经出现,因为您修补了TestCase类中的方法。你可以在Python官方unittest.patch文档中找到:
Patch 可以用作 TestCase 类装饰器。它的工作原理是装饰类中的每个测试方法。当您的测试方法共享公共补丁集时,这会减少样板代码。patch() 通过查找以 patch.TEST_PREFIX 开头的方法名称来查找测试。默认情况下,这是“test”,它与 unittest 查找测试的方式匹配。您可以通过设置 patch.TEST_PREFIX 来指定备用前缀。
所以所有带有前缀的方法test都会被补丁修饰。这是默认行为。
| 归档时间: |
|
| 查看次数: |
609 次 |
| 最近记录: |