Pytest Monkeypatch包本机实例方法

时间:2019-05-09 23:14:45

标签: python pytest monkeypatching

我正在尝试使用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)仅适用于静态方法,而不适用于实例方法或类方法。进行此类测试以修补第三方本机包实例方法的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

由于您正在调用Account类的构造函数,并且您要模拟的方法是该构造函数的返回值的属性,因此您需要模拟该构造函数的返回值,然后monkeypatch模拟的download属性。

这是我要怎么做:

@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