Estou usando a biblioteca Mock para testar meu aplicativo, mas quero afirmar que alguma função não foi chamada. Os documentos falsos falam sobre métodos como mock.assert_called_with
e mock.assert_called_once_with
, mas não encontrei nada parecido mock.assert_not_called
ou algo relacionado para verificar se o mock NÃO foi chamado .
Eu poderia usar algo como o seguinte, embora não pareça legal nem pitônico:
def test_something:
# some actions
with patch('something') as my_var:
try:
# args are not important. func should never be called in this test
my_var.assert_called_with(some, args)
except AssertionError:
pass # this error being raised means it's ok
# other stuff
Alguma idéia de como fazer isso?
python
unit-testing
mocking
python-mock
Gerard
fonte
fonte
Respostas:
Isso deve funcionar para o seu caso;
Amostra;
fonte
AttributeError: MockCallable instance has no attribute 'called'
sudo easy_install -U mock
efrom mock import Mock
no MacOS, o acima é executado sem problemas. Nunca instalado Django :)from mock import Mock
com o Python Mock 0.1.0 para meus testes. Isso soa problemático?module_to_test.another_module.class = mock.Mock()
, você pode confirmar que isso não se lembra de chamadas em diferentes casos de teste (instâncias unittest.TestCase)? Eu acho que a contagem de chamadas não é redefinida neste casoEmbora seja uma pergunta antiga, gostaria de adicionar que atualmente a
mock
biblioteca (backport of unittest.mock) suporta oassert_not_called
método.Basta atualizar o seu;
pip install mock --upgrade
fonte
Você pode verificar o
called
atributo, mas se sua afirmação falhar, a próxima coisa que você deseja saber é algo sobre a chamada inesperada; portanto, você também pode providenciar para que essas informações sejam exibidas desde o início. Usandounittest
, você pode verificar o conteúdocall_args_list
:Quando falha, envia uma mensagem como esta:
fonte
Quando você testa usando a classe herda unittest.TestCase, você pode simplesmente usar métodos como:
e similar (na documentação do python, você encontra o resto).
No seu exemplo, podemos simplesmente afirmar se a propriedade mock_method.called é False , o que significa que o método não foi chamado.
fonte
Com
python >= 3.5
você pode usarmock_object.assert_not_called()
.fonte
A julgar por outras respostas, ninguém, exceto @ rob-kennedy, falou sobre o
call_args_list
.É uma ferramenta poderosa para a qual você pode implementar exatamente o contrário de
MagicMock.assert_called_with()
call_args_list
é uma lista decall
objetos. Cadacall
objeto representa uma chamada feita em uma chamada simulada.Consumir um
call
objeto é fácil, pois você pode compará-lo com uma tupla de comprimento 2, onde o primeiro componente é uma tupla contendo todos os argumentos posicionais da chamada relacionada, enquanto o segundo componente é um dicionário dos argumentos da palavra-chave.Portanto, uma maneira de abordar o problema específico do OP é
Observe que dessa maneira, em vez de apenas verificar se uma chamada simulada foi chamada, via
MagicMock.called
, agora você pode verificar se ela foi chamada com um conjunto específico de argumentos.Isso é útil. Digamos que você queira testar uma função que recebe uma lista e chama outra função
compute()
, para cada valor da lista somente se eles satisfizerem uma condição específica.Agora você pode zombar
compute
e testar se foi chamado com algum valor, mas não com outros.fonte