2013-06-16 10 views
8

Quindi, ho una vista a forma di pallone, che aggiunge un'attività di sedani a una coda e restituisce 200 all'utente.Test unitario Visualizzazione di mocking di compiti di sedano

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 

Il problema è con il test di seguito, io non voglio avere un'istanza di sedano ecc ecc voglio solo sapere che dopo tutto la verifica è ok, restituisce 200 per l'utente . Il sedano launch_task() verrà testato altrove.

Quindi sono entusiasta di prendere in giro quella chiamata launch_task() così essenzialmente non fa nulla, rendendo la mia unità indipendente dall'istanza di sedan.

Ho provato varie incarnazioni di:

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

Ma non riesco a farlo funzionare, mio ​​punto di vista appena esce con un errore 500. Qualsiasi assistenza sarebbe apprezzata!

risposta

4

ho provato anche qualsiasi @patch decoratore e non ha funzionato e ho trovato finto in setUp come:

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

Il @task decoratore sostituisce la funzione con un oggetto Task (vedi documentation). Se prendi in giro l'attività, sostituirai l'oggetto (un po 'magico) Task con un MagicMock e non pianificherà affatto l'attività. Invece, prendi in giro il metodo run() dell'oggetto , in questo modo:

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