Eu tenho um arquivo python a.py
que contém duas classes A
e 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()
Eu gostaria de fazer um teste de unidade method_b
em classe B
zombando A
. Aqui está o conteúdo do arquivo testa.py
para esta finalidade:
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()
Espero obter Mocked A
na saída. Mas o que eu consigo é:
<MagicMock name='A().method_a()' id='4326621392'>
Onde estou fazendo errado?
python
python-unittest
magicmock
Mehdi Jafarnia Jahromi
fonte
fonte
A()
retorna oreturn_value
frommock_A
(um regularMagicMock
, já que você não especificou mais nada), que não é uma instância da classeA
. Você precisa definir issoreturn_value
para ser algo definidomethod_a
.mock_a
que deve ter o método, nãomock_a
ele mesmo.mock_a().method_a.return_value = 'Mocked A'
emock_a.return_value.method_a.return_value = 'Mocked A'
funcionaram. Muito obrigado por seus comentários. Você poderia ir em frente e colocar isso como uma resposta?Respostas:
Quando você
@mock.patch('a.A')
, está substituindo a classeA
no código em teste commock_a
.Em
B.method_b
você, entãoa = A()
, definir , que é agoraa = mock_a()
- ou seja,a
é oreturn_value
demock_a
. Como você não especificou esse valor, é um normalMagicMock
; isto também não está configurado, então você obtém a resposta padrão (ainda outraMagicMock
) ao chamar métodos nele.Em vez disso, você deseja configurar o
return_value
demock_a
para ter o método apropriado, que pode ser:mock_a().method_a.return_value = 'Mocked A' # ^ note parentheses
ou, talvez mais explicitamente:
mock_a.return_value.method_a.return_value = 'Mocked A'
Seu código teria funcionado no caso
a = A
(atribuindo a classe, não criando uma instância), pois entãoa.method_a()
teria acionado seu método mock.fonte
mock_data.configure_mock(columns='my_column')
resolver isso. Obrigado pela resposta embora. (ref: bradmontgomery.net/blog/how-world-do-you-mock-name-attribute )