Estamos usando o Mock para python há um tempo.
Agora, temos uma situação em que queremos zombar de uma função
def foo(self, my_param):
#do something here, assign something to my_result
return my_result
Normalmente, a maneira de zombar disso seria (assumindo que parte de um objeto)
self.foo = MagicMock(return_value="mocked!")
Mesmo se eu chamar foo () algumas vezes, eu posso usar
self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])
Agora, estou enfrentando uma situação na qual desejo retornar um valor fixo quando o parâmetro de entrada tiver um valor específico. Então, se vamos dizer "my_param" é igual a "alguma coisa", quero retornar "my_cool_mock"
Parece estar disponível no mockito para python
when(dummy).foo("something").thenReturn("my_cool_mock")
Estive pesquisando sobre como conseguir o mesmo com Mock sem sucesso?
Alguma ideia?
python
unit-testing
mocking
mockito
Juan Antonio Moriano, Gomez
fonte
fonte
monkeypatch
. O Monkeypatch é mais para "substituir essa função para fins de teste", enquanto o Mock é o que você usa quando também deseja verificarmock_calls
ou fazer afirmações sobre como foi chamado e assim por diante. Há um lugar para ambos, e geralmente os uso em momentos diferentes em um determinado arquivo de teste.Respostas:
http://www.voidspace.org.uk/python/mock/mock.html#calling
fonte
side effect
é o termo exato: en.wikipedia.org/wiki/Side_effect_(computer_science)CallableMixin.side_effect
, mas que a função separada definida no exemplo tem o mesmo nome.Conforme indicado no objeto Python Mock com o método chamado várias vezes
Uma solução é escrever meu próprio side_effect
Isso faz o truque
fonte
O efeito colateral assume uma função (que também pode ser uma função lambda ); portanto, em casos simples, você pode usar:
fonte
Acabei aqui procurando " como zombar de uma função baseada em argumentos de entrada " e finalmente resolvi isso criando uma função aux simples:
Agora:
Espero que isso ajude alguém!
fonte
Você também pode usar
partial
fromfunctools
se quiser usar uma função que aceita parâmetros, mas a função que você está zombando não. Por exemplo:Isso retornará uma chamada que não aceita parâmetros (como o fuso horário do Django.now ()), mas minha função mock_year aceita.
fonte
got multiple values for argument
.Apenas para mostrar outra maneira de fazer isso:
fonte
Você também pode usar
@mock.patch.object
:Digamos que um módulo
my_module.py
usepandas
para ler um banco de dados e gostaríamos de testá-lo usando opd.read_sql_table
método de zombaria (que tomatable_name
como argumento).O que você pode fazer é criar (dentro do seu teste) um
db_mock
método que retorne objetos diferentes, dependendo do argumento fornecido:Na sua função de teste, você faz:
fonte
Se você "deseja retornar um valor fixo quando o parâmetro de entrada tiver um valor específico" , talvez você nem precise de um mock e possa usar um
dict
junto com seuget
método:Isso funciona bem quando a saída do seu falso é um mapeamento de entrada. Quando é uma função de entrada, sugiro usar de
side_effect
acordo com a resposta de Amber .Você também pode usar uma combinação de ambos se quiser preservar
Mock
os recursos (assert_called_once
,call_count
etc):fonte
Eu sei que é uma pergunta bastante antiga, pode ajudar como uma melhoria usando python lamdba
fonte