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)