【问题标题】:Pytest Monkeypatch package native instance methodPytest Monkeypatch 封装原生实例方法
【发布时间】:2019-05-09 23:14:44
【问题描述】:

我正在尝试使用 pytest 和 monkeypatch 对使用第三方数据集成包的方法进行单元测试。

这是一些示例伪代码:

from third_party.data_integration import Account

def fetch_data():
    account_id = "123"
    account_token = "234"

    account = Account(account_id, account_token)
    account.download('path')
    return True

我希望在我的测试文件中做一些类似的事情来猴子补丁 download 实例函数:

def test_fetch_data(monkeypatch):

    def download():
        return '123'

    with monkeypatch.context() as m:
         m.setattr('third_party.data_integration.Account.download', download)
         assert fetch_data() == True

显然,m.setattr('third_party.data_integration.Account.download', download) 仅适用于静态方法,而不适用于实例方法或类方法。像这样对第三方原生包实例方法进行猴子补丁测试的最佳实践是什么?

【问题讨论】:

    标签: python pytest monkeypatching


    【解决方案1】:

    由于您正在调用 Account 类的构造函数,并且您要模拟的方法是该构造函数的返回值的属性,因此您需要模拟构造函数的返回值,然后对 @987654322 进行猴子补丁@ 模拟的属性。

    我会这样做:

    @mock.patch('third_party.data_integration.Account')
    def test_fetch_data(mock_account):
    
        def download():
            return '123'
        acc = MagicMock()
        acc.download = download
        mock_account.return_value = acc
        assert fetch_data() == True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2016-11-10
      相关资源
      最近更新 更多