Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 23, 2015 23:48:35

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Mock классов и методов

Продолжаю разбираться с этой бедой, и вот, что имею (Python 2.7):

1)

from mock import Mock, patch, create_autospec
 
class A(object):
    def func1(self, arg):
        return arg
 
 
class B(object):
    def func1(self, arg):
        a = A()
        return "=== %s ===" % a.func1(arg)
 
 
b = B()
print b.func1("hello") # === hello ===
 
mocked_A = create_autospec(A)
ma = mocked_A()
print ma.func1("hello") # <MagicMock bla-bla-bla'>
 
ma.func1.return_value = "world"
print ma.func1("hello") # world
 
globals()['A'] = mocked_A
b = B()
print b.func1("hello") # === world ===

Вывод:
=== hello ===
<MagicMock name='mock().func1()' id='3070641676'>
world
=== world ===

2) если же, вместо
ma.func1.return_value = "world"
написать
mocked_A.func1.return_value = "world"
, что казалось бы логичнее, так как вроде патчим именно класс, а не экземпляр, то будет вот так:

from mock import Mock, patch, create_autospec
 
class A(object):
    def func1(self, arg):
        return arg
 
 
class B(object):
    def func1(self, arg):
        a = A()
        return "=== %s ===" % a.func1(arg)
 
 
b = B()
print b.func1("hello") # === hello ===
 
mocked_A = create_autospec(A)
ma = mocked_A()
print ma.func1("hello") # <MagicMock bla-bla-bla'>
 
mocked_A.func1.return_value = "world"
print ma.func1("hello") # world
 
globals()['A'] = mocked_A
b = B()
print b.func1("hello") # === world ===

Вывод:

=== hello ===
<MagicMock name='mock().func1()' id='3070903788'>
<MagicMock name='mock().func1()' id='3070903788'>
=== <MagicMock name='mock().func1()' id='3070903788'> ===

Видимо, Я здесь что-то недопонял. Как же так работает этот mock? Почему? Мне нужно поведение, как в 1-м варианте, что в принципе добился, но ещё не до конца протестил на настоящих модулях и классах (да, оно связано с предыдущим вопросом). Или может подскажете хотя бы нормальный гайд, ибо в оффициальной документации таких интересных случаев не разбирают.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Отредактировано Master_Sergius (Дек. 23, 2015 23:49:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version