2017-02-11 3 views
0

Я, должно быть, устал, потому что, конечно, есть простой способ сделать это. Но я прочитал документы pytest и не могу понять этот простой вариант использования.pytest: как мне получить экземпляры (mock), возвращенные из класса?

У меня есть небольшой пакет, я хочу, чтобы тест:

class MyClass: 
    def __init__(self): 
     pass 
    def my_method(self, arg): 
     pass 

def the_main_method(): 
    m = MyClass() 
    m.my_method(123) 

Я хотел бы, чтобы убедиться, что (1) экземпляр MyClass создается, и что (2) my_method называется, с соответствующими аргументами ,

Так вот мой тест:

from unittest.mock import patch 

@patch('mypkg.MyClass', autospec=True) 
def test_all(mocked_class): 

    # Call the real production code, with the class mocked. 
    import mypkg 
    mypkg.the_main_method() 

    # Ensure an instance of MyClass was created. 
    mocked_class.assert_called_once_with() 

    # But how do I ensure that "my_method" was called? 
    # I want something like mocked_class.get_returned_values() ... 

Я понимаю, что каждый раз, когда производственный код вызывает MyClass()unittest рамки подстегивает новый Передразнивало экземпляр.

Но как я могу воспользоваться этими примерами?

Я хочу написать что-то вроде:

the_instance.assert_called_once_with(123) 

Но где я получаю the_instance от?

ответ

0

Ну, к моему удивлению, нет только один фиктивный экземпляр создан, независимо от того, сколько раз вы вызываете конструктор (:

Что я могу написать это:

mocked_class.return_value.my_method.assert_called_once_with(123) 

return_value не представляет собой одного возвращаемого значения, однако - он накапливает информацию для всех созданных экземпляров.

Это довольно заумный подход , в моей голове. Я предполагаю, что он был скопирован из какой-то сумасшедшей насмешливой библиотеки Java (:

Если вы хотите, чтобы захватить отдельные возвращаемые объекты, вы можете использовать .side_effect вернуть все, что вы хотите, и записать его в своем списке, и т.д.

+0

" Ну, к моему удивлению, нет никаких штучных экземпляров, созданных «Да, есть. Почему, по-вашему, нет?». Значение return_value не представляет собой одного возвращаемого значения, хотя - оно накапливает информацию для всех созданных экземпляров ». потому что по умолчанию макет только когда-либо создает одно возвращаемое значение и повторно использует его каждый раз, когда он вызывается. Возвращаемое значение возвращается. – user2357112

+0

Не следует ли тестировать 'mocked_class.return_value.my_method.assert_called_once_with (123)'? – user2357112

+0

@ user2357112: Что касается вашего первого комм как вы говорите, по умолчанию создается только один экземпляр 'return_value', а не один для каждого вызова конструктора. Вот что я пытался получить с моим ответом. Я сделаю это более ясным. Прямо во второй точке я пропустил кусок метода. – jwd

Смежные вопросы