Estoy usando la biblioteca Mock para probar mi aplicación, pero quiero afirmar que no se llamó a alguna función. Los documentos simulados hablan sobre métodos como mock.assert_called_withy mock.assert_called_once_with, pero no encontré nada parecido mock.assert_not_calledo algo relacionado para verificar que NO se llamara simulacro .
Podría ir con algo como lo siguiente, aunque no parece genial ni 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
¿Alguna idea de cómo lograr esto?
                    
                        python
                                unit-testing
                                mocking
                                python-mock
                                
                    
                    
                        Gerard
fuente
                
                fuente

Respuestas:
Esto debería funcionar para su caso;
Muestra;
fuente
AttributeError: MockCallable instance has no attribute 'called'sudo easy_install -U mockyfrom mock import Mocken MacOS, lo anterior se ejecuta sin problemas. Nunca instalé Django :)from mock import Mockcon Python Mock 0.1.0 para mis pruebas. ¿Algo de eso suena problemático?module_to_test.another_module.class = mock.Mock(), ¿puede confirmar que no recuerda llamadas en diferentes casos de prueba (unittest.TestCase)? Creo que el recuento de llamadas no se restablece en este casoAunque es una vieja pregunta, me gustaría agregar que actualmente la
mockbiblioteca (backport de unittest.mock) admite elassert_not_calledmétodo.Solo actualiza el tuyo;
pip install mock --upgradefuente
Puede verificar el
calledatributo, pero si su afirmación falla, lo siguiente que querrá saber es algo sobre la llamada inesperada, por lo que también puede organizar que esa información se muestre desde el principio. Usandounittest, puede verificar el contenido de en sucall_args_listlugar:Cuando falla, da un mensaje como este:
AssertionError: los recuentos de elementos no fueron iguales: Primero tiene 0, Segundo tiene 1: llamada ('primer argumento', 4)fuente
Cuando prueba usando la clase hereda unittest.TestCase , simplemente puede usar métodos como:
y similar (en la documentación de Python encontrará el resto).
En su ejemplo, simplemente podemos afirmar si la propiedad mock_method.called es False , lo que significa que no se llamó al método.
fuente
Con
python >= 3.5usted puede usarmock_object.assert_not_called().fuente
A juzgar por otras respuestas, nadie excepto @ rob-kennedy habló sobre el
call_args_list.Es una herramienta poderosa para que pueda implementar exactamente lo contrario de
MagicMock.assert_called_with()call_args_listes una lista decallobjetos Cadacallobjeto representa una llamada realizada en una llamada simulada.Consumir un
callobjeto es fácil, ya que puede compararlo con una tupla de longitud 2 donde el primer componente es una tupla que contiene todos los argumentos posicionales de la llamada relacionada, mientras que el segundo componente es un diccionario de los argumentos de palabras clave.Entonces, una forma de abordar el problema específico del OP es
Tenga en cuenta que de esta manera, en lugar de simplemente verificar si se ha llamado a una llamada simulada, a través de
MagicMock.called, ahora puede verificar si se ha llamado con un conjunto específico de argumentos.Eso es útil Supongamos que desea probar una función que toma una lista y llamar a otra función
compute(), para cada uno de los valores de la lista solo si cumplen una condición específica.Ahora puede burlarse
computey probar si ha sido invocado en algún valor pero no en otros.fuente