unittest unitarias pruebas python unit-testing mocking flask celery

python - unitarias - Vista de matraz de prueba unitaria burlarse de las tareas de apio



pruebas unitarias python (2)

Entonces, tengo una vista de matraz, que agrega una tarea de apio a una cola, y devuelve 200 al usuario.

from flask.views import MethodView from app.tasks import launch_task class ExampleView(MethodView): def post(self): # Does some verification of the incoming request, if all good: launch_task(task, arguments) return ''Accepted'', 200

El problema es probar lo siguiente, no quiero tener que tener una instancia de apio, etc., etc. Solo quiero saber que después de todo, la verificación está bien, devuelve 200 al usuario. El apio launch_task() se probará en otro lugar.

Por lo tanto, estoy dispuesto a burlarme de esa llamada a launch_task() así que esencialmente no hace nada, lo que hace que mi unittest sea independiente de la instancia de apio.

He intentado varias encarnaciones de:

@mock.patch(''app.views.launch_task.delay''): def test_launch_view(self, mock_launch_task): mock_launch_task.return_value = None # post a correct dictionary to the view correct_data = {''correct'': ''params''} rs.self.app.post(''/launch/'', data=correct_data) self.assertEqual(rs.status_code, 200) @mock.patch(''app.views.launch_task''): def test_launch_view(self, mock_launch_task): mock_launch_task.return_value = None # post a correct dictionary to the view correct_data = {''correct'': ''params''} rs.self.app.post(''/launch/'', data=correct_data) self.assertEqual(rs.status_code, 200)

Pero parece que no puede hacer que funcione, mi vista simplemente sale con un error de 500. ¡Cualquier ayuda sería apreciada!


@patch también cualquier decorador de @patch y no funcionó Y encontré simulacro en setUp como:

import unittest from mock import patch from mock import MagicMock class TestLaunchTask(unittest.TestCase): def setUp(self): self.patcher_1 = patch(''app.views.launch_task'') mock_1 = self.patcher_1.start() launch_task = MagicMock() launch_task.as_string = MagicMock(return_value = ''test'') mock_1.return_value = launch_task def tearDown(self): self.patcher_1.stop()


El decorador @task reemplaza la función con un objeto Task (ver documentación ). Si se burla de la tarea en sí, reemplazará el objeto Task (algo mágico) con un MagicMock y no programará la tarea en absoluto. En cambio, simula el método run() del objeto Task , así:

# With CELERY_ALWAYS_EAGER=True @patch(''monitor.tasks.monitor_user.run'') def test_monitor_all(self, monitor_user): """ Test monitor.all task """ user = ApiUserFactory() tasks.monitor_all.delay() monitor_user.assert_called_once_with(user.key)