Как проверить, вызывается ли метод с ожидаемыми объектами - PullRequest
1 голос
/ 09 июля 2020

Как я могу проверить в pytest-mock, был ли вызван метод с соответствующим объектом или нет?

Мой объект следующий:

class Obj:

    def __init__(self):
        self.__param = []
        self.__test = []

    @property
    def param(self):
        return self.__param

    @param.setter
    def param(self, value):
        self.__param = value
    
    # both methods: getter and setter are also available for the self.__test     


    # This is just a dummy test object
class Test:
      
    def call_method(self, text:str):
        obj = Obj()
        obj.param = [("test", "1"), ("test2", "2")]
        self.test_call(text, obj)

    def test_call(self, text:str, object: Obj):
        pass

Мой тест следующий :

def test_method(mocker):
    mock_call = mocker.patch.object(Test, "test_call")

    test = Test()
    test.call_method("text")

    expected_obj = Obj()
    expected_obj.param = [("test", "1"), ("test2", "2")]

    mock_call.assert_called_once_with("text", expected_obj)

На данный момент я получаю сообщение об ошибке:

assert ('text...7fbe9b2ae4e0>) == ('text...7fbe9b2b5470>)

Кажется, что pytest проверяет, имеют ли оба объекта одинаковые адреса. Я просто хочу проверить, имеют ли оба объекта одинаковые параметры. Как это проверить?

1 Ответ

1 голос
/ 09 июля 2020

Вы не можете использовать assert_called_with, если не хотите проверять идентичность объекта - вместо этого вам нужно напрямую проверить аргументы:

def test_method(mocker):
    mock_call = mocker.patch.object(Test, "test_call")

    test = Test()
    test.call_method("text")

    mock_call.assert_called_once()
    assert len(mock_call.call_args[0]) == 2
    assert mock_call.call_args[0][0] == "text"
    assert mock_call.call_args[0][1].param == [("test", "1"), ("test2", "2")]

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

Обратите внимание, что call_args - это список кортежей , где первый элемент содержит все позиционные аргументы, а второй элемент - все аргументы ключевого слова, поэтому вы должны использовать индексы [0][0] и [0][1] для адресации двух позиционных аргументов.

...