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_with
y mock.assert_called_once_with
, pero no encontré nada parecido mock.assert_not_called
o 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 mock
yfrom mock import Mock
en MacOS, lo anterior se ejecuta sin problemas. Nunca instalé Django :)from mock import Mock
con 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
mock
biblioteca (backport de unittest.mock) admite elassert_not_called
método.Solo actualiza el tuyo;
pip install mock --upgrade
fuente
Puede verificar el
called
atributo, 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_list
lugar:Cuando falla, da un mensaje como este:
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.5
usted 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_list
es una lista decall
objetos Cadacall
objeto representa una llamada realizada en una llamada simulada.Consumir un
call
objeto 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
compute
y probar si ha sido invocado en algún valor pero no en otros.fuente