Estou usando simulação com Python e queria saber qual dessas duas abordagens é melhor (leia: mais pythônico).
Método um : basta criar um objeto simulado e usá-lo. O código se parece com:
def test_one (self):
mock = Mock()
mock.method.return_value = True
self.sut.something(mock) # This should called mock.method and checks the result.
self.assertTrue(mock.method.called)
Método dois : Use patch para criar um mock. O código se parece com:
@patch("MyClass")
def test_two (self, mock):
instance = mock.return_value
instance.method.return_value = True
self.sut.something(instance) # This should called mock.method and checks the result.
self.assertTrue(instance.method.called)
Ambos os métodos fazem a mesma coisa. Não tenho certeza das diferenças.
Alguém poderia me esclarecer?
python
unit-testing
mocking
Sardathrion - contra o abuso de SE
fonte
fonte
Respostas:
mock.patch
é uma criatura muito diferente demock.Mock
.patch
substitui a classe por um objeto simulado e permite que você trabalhe com a instância simulada. Dê uma olhada neste snippet:patch
substituiMyClass
de uma forma que permite controlar o uso da classe nas funções que você chama. Depois de corrigir uma classe, as referências à classe são completamente substituídas pela instância simulada.mock.patch
geralmente é usado quando você está testando algo que cria uma nova instância de uma classe dentro do teste.mock.Mock
as instâncias são mais claras e preferidas. Se o seuself.sut.something
método criou uma instância de emMyClass
vez de receber uma instância como parâmetro,mock.patch
seria apropriado aqui.fonte
Eu tenho um video do youtube no sobre isso.
Resposta curta: use
mock
quando estiver passando algo de que deseja zombar epatch
se não for. Dos dois, o mock é fortemente preferido porque significa que você está escrevendo código com injeção de dependência adequada.Exemplo bobo:
fonte