2015-07-31 14 views
5

L'app su cui sto lavorando è fortemente asincrona. L'applicazione Web esegue molte attività attraverso il sedano in base alle azioni dell'utente. Gli stessi compiti di sedano sono in grado di avviare ulteriori compiti.Come testare il codice di test che esegue le attività di sedano?

Codice come quello mostrato di seguito si verifica abbastanza frequentemente nel nostro codice.

def do_sth(): 
    logic(); 
    if condition: 
     function1.apply_async(*args) 
    else: 
     function2.apply_asynch(*args) 

Ora vogliamo iniziare l'unità testando qualsiasi nuovo codice che scriviamo e non siamo sicuri di come farlo. Quello che vorremmo affermare nei nostri test di unità pytest è che vogliamo vedere se la funzione 1 è stata effettivamente chiamata. Non vogliamo necessariamente eseguire lo stesso function1 dato che avremo un test unitario per lo function1.

Non voglio eseguire il sedano come processo, né voglio eseguire alcun broker AMQP durante la sessione di test dell'unità.

È possibile?

Modifica

è stato fatto notare che si tratta di un duplicato di How do you unit test a Celery task?

Non è. Pensaci. Quello che sto chiedendo è come verificare se la funzione ha chiamato function1 tramite apply_async. Quella domanda è su come faccio a testare function1 stesso. C'è una grande differenza. Ho fatto questa domanda prima di inquadrare questo.

+0

possibile duplicato (http://stackoverflow.com/questions/12078667/how-do-you-unit-test-a-celery-task) – olofom

+1

Non è un duplicato –

+0

Ho visto questa domanda e non è quello che sto chiedendo. Se non è chiaro si prega di fare più domanda –

risposta

7

Dai un'occhiata alla libreria Mock che consente di sostituire le funzioni che non vuoi essere invocate con "mock" che sembrano sufficientemente simili alle funzioni originali per convincere il codice chiamante che sta invocando la "cosa reale". Puoi quindi verificare che la simulazione sia stata effettivamente invocata e con quali parametri. Esempio: [? Come si fa a unità di prova di un compito di sedano]

import mock 

def test_do_sth(): 
    with mock.patch('function1.apply_async') as function1_mock: 
     do_sth() 
     assert function1_mock.called 
+1

Si noti che è anche possibile utilizzare 'function1_mock.assert_called_once_with (* args)' per verificare il numero di chiamate e se è stato chiamato con argomenti corretti. – matino

+0

Puoi anche usare la patch come decoratore per la funzione di test (in questo caso, test_do_sth), che preferisco. –

Problemi correlati