我还没有在网上找到对此的很好的解释,我猜想我遗漏了一些琐碎的东西,但是我却找不到,所以我来这里问专家:)
我有一个测试,需要修补构造函数调用,据我了解,阅读文档,类似的方法应该可以,但是:
import unittest.mock as mocker
import some_module
mock_class1 = mocker.patch('some_module.some_class')
print(mock_class1 is some_module.some_class) # Returns False
print(mock_class1) # <unittest.mock._patch>
mock_instance1 = mock_class1.return_value # _patch object has no attr return_value
相反,如果执行此操作,则会得到不同的输出
with mocker.patch('some_module.some_class') as mock_class2:
print(mock_class2 is some_module.some_class) # Returns True
print(mock_class2) # <MagicMock name=...>
mock_instance2 = mock_class2.return_value # No problem
print(mock_instance2) # <NonCallableMagicMock name=...>
现在,对于测试本身,我正在使用pytest-mock模块,该模块提供了行为类似第一个代码块的模拟装置。
我想知道:
为什么行为根据调用模拟框架的方式而不同
有没有一种干净的方法来触发没有该with子句的第二个代码块的行为?
pytest模拟插件正在开发中,以避免使用上下文管理器;可能不是每个人都不太喜欢标准模拟程序与功能参数2)一起玩的方式。它旨在用作内容管理器或功能装饰器。我认为没有pytest可以使用模拟程序包
参考 https://github.com/pytest-dev/pytest-mock https://www.packtpub.com/mapt/book/application_development/9781847198846/5/ch05lvl1sec45/integrating-with-python-mocker
如何安装pytest-mock并创建这样的测试
import itertools
def test1(mocker):
mock_class1 = mocker.patch('itertools.count')
print(mock_class1 is itertools.count)
print(mock_class1)
mock_instance1 = mock_class1.return_value # Magic staff...
还是正在使用monkeypatching?只是不要将标准unittest.mock与pytest一起使用
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。