2013-06-16 10 views
8

Mam zatem widok kolby, który dodaje zadanie związane z selerem do kolejki i zwraca 200 użytkownikowi.Test jednostkowy Widok kolby kpiący z zadań związanych z selerem

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 

Problem jest z testowania następuje, ja nie chcę mieć wystąpienie seler itp itd po prostu chcą wiedzieć, że po tym wszystkim weryfikacja jest ok, to zwraca 200 dla użytkownika . Seler launch_task() będzie testowany w innym miejscu.

Dlatego bardzo chcę wyśmiać to wezwanie launch_task(), więc w zasadzie nic nie robi, czyniąc moje unieruchamianie niezależnym od instancji selera.

Próbowałem różne inkarnacje:

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

Ale nie wydaje się uzyskać go do pracy, moim zdaniem właśnie kończy pracę z 500 błędów. Każda pomoc będzie doceniona!

Odpowiedz

4

Próbowałem też żadnej @patch dekorator i to nie działa I znalazłem makiety w setUp jak:

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

@task dekorator zastępuje funkcję z Task obiektu (patrz documentation). Jeśli kpisz z samego zadania, wymienisz (nieco magiczny) obiekt Task na MagicMock i nie zaplanuje on zadania w ogóle. Zamiast tego wyśmiewać metodę obiektu Task obiektu run(), na przykład: