Mam plik Pythona, a.py
który zawiera dwie klasy A
i B
.
class A(object):
def method_a(self):
return "Class A method a"
class B(object):
def method_b(self):
a = A()
print a.method_a()
Chciałbym odpocząć method_b
w klasie B
, kpiąc A
. Oto zawartość pliku testa.py
do tego celu:
import unittest
import mock
import a
class TestB(unittest.TestCase):
@mock.patch('a.A')
def test_method_b(self, mock_a):
mock_a.method_a.return_value = 'Mocked A'
b = a.B()
b.method_b()
if __name__ == '__main__':
unittest.main()
Spodziewam się, że wyjdę Mocked A
. Ale otrzymuję:
<MagicMock name='A().method_a()' id='4326621392'>
Gdzie ja robię źle?
python
python-unittest
magicmock
Mehdi Jafarnia Jahromi
źródło
źródło
A()
zwracareturn_value
frommock_A
(zwykłyMagicMock
, ponieważ nie określono niczego innego), który nie jest instancją klasyA
. Musisz ustawić toreturn_value
jako coś, co ma zdefiniowanemethod_a
.mock_a
powinna mieć metodę, a niemock_a
siebie.mock_a().method_a.return_value = 'Mocked A'
imock_a.return_value.method_a.return_value = 'Mocked A'
działały. Wielkie dzięki za komentarze. Czy mógłbyś kontynuować i podać to jako odpowiedź?Odpowiedzi:
Kiedy
@mock.patch('a.A')
zamieniasz klasęA
w testowanym kodzie namock_a
.W
B.method_b
tobie więc ustawa = A()
, co jest teraza = mock_a()
- czylia
jestreturn_value
zmock_a
. Ponieważ nie określiłeś tej wartości, jest to zwykłaMagicMock
; to też nie jest skonfigurowane, więc otrzymujesz domyślną odpowiedź (jeszcze innąMagicMock
) podczas wywoływania metod na niej.Zamiast tego, chcesz skonfigurować of mieć odpowiednią metodę, którą można zrobić jako:
return_value
mock_a
mock_a().method_a.return_value = 'Mocked A' # ^ note parentheses
lub, być może bardziej szczegółowo:
mock_a.return_value.method_a.return_value = 'Mocked A'
Twój kod zadziałałby w tym przypadku
a = A
(przypisując klasę, a nie tworząc instancję), ponieważ wtedya.method_a()
wywołałby twoją metodę pozorowaną.źródło
mock_data.configure_mock(columns='my_column')
który go rozwiązuje. Ale dzięki za odpowiedź. (ref: bradmontgomery.net/blog/how-world-do-you-mock-name-attribute )