Метод Pytest Monkeypatch для собственного экземпляра - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь использовать 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 голосов
/ 10 мая 2019

Так как вы вызываете конструктор класса 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
...