Python Mock не утверждает вызовы

Я использую mock-библиотеку для исправления класса в программе, которая подключается к внешнему ресурсу и отправляет словарь.

Структура выглядит примерно так...

код.py

def make_connection():
    connection = OriginalClass(host, port)
    connection.connect()
    connection.send(param)
    connection.close()

test.py

@mock.path('code.OriginalClass')
def test_connection(self, mocked_conn):
    code.make_connection()
    mocked_conn.assert_called_with(host, port)
    mocked_conn.connect.assert_called_once()
    mocked_conn.send.assert_called_with(param)

Первый assert_called_with работает отлично, но вызовы метода фиктивного класса не проходят. Я также безуспешно пытался использовать patch.object в качестве декоратора.


person cllamach    schedule 13.10.2014    source источник


Ответы (1)


Методы connect() и send() вызываются для возвращаемого значения первого вызова; соответствующим образом скорректируйте свой тест:

mocked_conn.return_value.connect.assert_called_once()
mocked_conn.return_value.send.assert_called_with(param)

Я обычно сначала сохраняю ссылку на «экземпляр»:

@mock.path('code.OriginalClass')
def test_connection(self, mocked_conn):
    code.make_connection()
    mocked_conn.assert_called_with(host, port)
    mocked_instance = mocked_conn.return_value
    mocked_instance.connect.assert_called_once()
    mocked_instance.send.assert_called_with(param)
person Martijn Pieters    schedule 13.10.2014
comment
Невероятно, я не могу поверить, что не видел этого. Могу ли я проголосовать за это более 9000? Спасибо огромная дымящаяся куча лотов. :D Я собираюсь начать хранить эту ссылку с этого момента, избегая подобных головных болей. - person cllamach; 13.10.2014