Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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 未正确拆除unittest模拟_Python_Mocking_Pytest_Python Unittest - Fatal编程技术网

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…的
)使我的整个测试套件工作,但我真正感兴趣的是理解这种方法失败的原因

非常感谢