开发者社区> 问答> 正文

了解python模拟框架

我还没有在网上找到对此的很好的解释,我猜想我遗漏了一些琐碎的东西,但是我却找不到,所以我来这里问专家:)

我有一个测试,需要修补构造函数调用,据我了解,阅读文档,类似的方法应该可以,但是:

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子句的第二个代码块的行为?

展开
收起
祖安文状元 2020-02-23 16:01:00 802 0
1 条回答
写回答
取消 提交回答
  • 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一起使用

    2020-02-23 16:01:11
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载