【发布时间】:2014-12-13 11:15:32
【问题描述】:
我的理解是,当您在单元测试中使用补丁装饰器时(我正在使用鼻子框架),该补丁装饰器的范围就是测试用例的范围。问题来了:
@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 中,我在实际代码中添加了一个打印语句,以调试抛出的错误。事实证明,通过 url 命中的控制器操作中的函数调用之一是返回一个 MagicMock 对象!它是上一个测试用例中的 mock_b。
如果我只是颠倒两个测试用例的顺序,没有任何变化。如果我用补丁装饰器注释掉那个,我的第二个测试用例就通过了。
附加信息: 这些实例方法所在的类上没有补丁装饰器。
有什么想法吗?
--更新--
事实证明,我没有模拟我的函数调用 from where they were being looked up,这解决了问题。但是,它并没有解释为什么补丁的范围超过了一个测试用例。
如果控制器仅在使用 app.get 发送 GET 请求时才被实例化,并且控制器文件中的导入被模拟,为什么 MagicMock 对象会在多个单元测试中持续存在?
【问题讨论】:
-
如果能把所有代码都展示出来就更好了。确实感觉嘲笑的一些全球性副作用会持续存在。
-
一些缓存或单例...
-
@JanusTroelsen 你能用重现问题所需的最短代码改进问题吗?
标签: python unit-testing mocking nose