2013-06-16 7 views
8

So habe ich eine Kolben-Ansicht, die eine Sellerie-Aufgabe zu einer Warteschlange hinzufügt und eine 200 an den Benutzer zurückgibt.Komponententest Flask view spotting Sellerie Tasks

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 

Das Problem ist folgendes mit Testen, ich will keinen Sellerie-Instanz haben müssen etc. etc. Ich möchte nur wissen, dass nach all der Überprüfung in Ordnung ist, ist es 200 an den Benutzer zurückgibt . Der Sellerie launch_task() wird an anderer Stelle getestet.

Daher bin ich scharf darauf, dass launch_task() Call so im Wesentlichen es tut nichts, macht meine unitest unabhängig von der Sellerie-Instanz.

Ich habe verschiedene Inkarnationen versucht:

@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) 

Aber kann nicht scheinen, um es zu bekommen zu arbeiten, meine Ansicht verlässt nur mit einem 500-Fehler. Jede Hilfe wäre willkommen!

Antwort

4

Ich habe auch versucht jeden @patch Dekorateur und es nicht funktionierte Und ich fand Mock in setUp wie:

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() 
1

Die @task Dekorateur die Funktion mit einem Task Objekt ersetzt (siehe documentation). Wenn Sie die Aufgabe selbst verspotten, ersetzen Sie das (etwas magische) Task Objekt durch eine MagicMock und es wird die Aufgabe überhaupt nicht geplant. Stattdessen verspotten die run() Methode des Task Objekt, etwa so:

# 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)