Python 未正确拆除unittest模拟
我使用Python 未正确拆除unittest模拟,python,mocking,pytest,python-unittest,Python,Mocking,Pytest,Python Unittest,我使用unittest.mock.patch.object作为上下文管理器。我的理解是,在点击上下文管理器的\uuuuu exit\uuuuu之后,任何东西都不会再被嘲笑了,但我非常确定,我在其他测试中看到了这一点的副作用。我正在使用pytest作为我的测试框架 最简单的例子如下所示: #my_code.py 从一些其他文件导入Foo def main(): foo=foo() 做点什么 我的目标是使它能够在my_code.py中实例化Foo时返回一个模拟,该模拟将存储在Foo中 测试结果如下
unittest.mock.patch.object
作为上下文管理器。我的理解是,在点击上下文管理器的\uuuuu exit\uuuuu
之后,任何东西都不会再被嘲笑了,但我非常确定,我在其他测试中看到了这一点的副作用。我正在使用pytest
作为我的测试框架
最简单的例子如下所示:
#my_code.py
从一些其他文件导入Foo
def main():
foo=foo()
做点什么
我的目标是使它能够在my_code.py
中实例化Foo
时返回一个模拟,该模拟将存储在Foo
中
测试结果如下所示:
#测试我的代码.py
从unittest导入模拟
导入我的密码
def测试_main():
mock_instance=mock.MagicMock()
使用mock.patch.object(my_code.Foo,'._new_uuuuu',return_value=mock_instance)作为Foo_构造函数:
my_code.main()
断言foo\u构造函数。调用\u计数==1
断言mock_instance.do_something.call_count==1
这个测试通过了。问题是,现在我所有其他创建Foo
实例的测试都失败了!在我添加test\u my\u code.py
之前,这些测试都没有失败,当我删除test\u my\u code.py
时,所有其他测试都会再次通过。更重要的是,我正在使用pytest随机顺序
(一个使pytest
以随机顺序运行测试的插件)。我注意到,如果test\u main
是最后一个要运行的测试,那么一切都会通过。如果test\u main
是第一个运行的测试,它将是唯一通过的测试。所有失败的测试都有回溯,回溯结果如下:
variable_in_other_test = Foo()
TypeError: object() takes no parameters
所有这些都让我觉得测试结束后,上下文管理器并没有拆掉模拟。我能够使用不同的模拟方法(即那些不依赖于mock.patch.object…的)使我的整个测试套件工作,但我真正感兴趣的是理解这种方法失败的原因
非常感谢