Почему не работает Zeep.Client? - PullRequest
0 голосов
/ 27 ноября 2018

Я пишу модульные тесты для фрагмента кода, который использует Zeep для доступа к SOAP API, поэтому я хочу макетировать Zeep.В моем реальном коде это выглядит примерно так:

from zeep import Client

def do_something():
    client = Client("...")

В моем тесте я делаю это:

from unittest import mock

@mock.patch('zeep.Client')
def test_do_somethi(self, MockedClient):
    do_something()

Client, полученное реальной функцией,это фактический клиент Zeep, а не мое издевательство.Я также попытался:

@mock.patch('zeep.client.Client')

, и результат был таким же.

Я также попытался:

def test_do_something(self):
  with mock.patch('zeep.client.Client') as MockedClient:
     do_something()

без разницы.

Любойидеи, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы должны исправить метод / класс из файла, который вы используете.Если вы хотите установить патч Client и он импортируется в some_file.py , вы должны импортировать его из него, а не из lib (zeep.Client)

Вот пример использования официальный документ от Zeep.

some_lib.py

from zeep import Client

def do_something():
    wsdl = 'http://www.soapclient.com/xml/soapresponder.wsdl'
    client = zeep.Client(wsdl=wsdl)
    return client.service.Method1('Zeep', 'is cool')

test_connection.py

from some_lib import do_something
from unittest.mock import patch

@patch('some_lib.Client')
def test_do_something(mock_zeep):
    res = do_something()
    assert mock_zeep.call_count == 1


if __name__ == '__main__':
    test_soap_conn()
0 голосов
/ 27 ноября 2018

Когда макет не работает, первое, что нужно искать, это если вы исправляете правильное имя.

Если вы хотите макетировать zeep, но вы импортируете как

from zeep import Client

и ваши тесты находятся в одном файле, вы исправляете Client, а не zeep.Client.Если вместо этого вы импортируете его как

import zeep

, а затем используете zeep.Client в коде SUT, тогда вы исправляете zeep.Client.

Если вы тестируете код, который находится в каком-то другом модуле (как mymodule), и вы импортируете туда zeep с

from zeep import Client # (1)

, затем в своем тестовом модуле вы

import mymodule

, затем вы исправляете mymodule.Client, ... или mymodule.zeep.Client если вы использовали альтернативную форму import zeep в (1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...