Il motivo per cui il codice non viene mostrato come coperto riguarda il modo in cui i metodi asincroni vengono implementati. Il compilatore C# traduce il codice in metodi asincroni in una classe che implementa una macchina a stati e trasforma il metodo originale in uno stub inizializzato e invoca quella macchina a stati. Poiché questo codice viene generato nell'assieme, è incluso nell'analisi della copertura del codice.
Se si utilizza un'attività che non è completa al momento dell'esecuzione del codice, la macchina di stato generata dal compilatore aggancia un callback di completamento per riprendere al termine dell'attività. Questo esercita più completamente il codice macchina dello stato e fornisce una copertura completa del codice (almeno per gli strumenti di copertura del codice a livello di istruzione).
Un modo comune per ottenere un'attività che non è completa al momento, ma che a un certo punto verrà completata è l'uso di Task.Delay nel test dell'unità. Tuttavia, questa è generalmente un'opzione scadente perché il ritardo temporale è troppo piccolo (e comporta una copertura del codice imprevedibile perché a volte l'attività è completa prima dell'esecuzione del codice in fase di test) o troppo grande (rallentando inutilmente i test).
Un'opzione migliore è utilizzare "attendere Task.Yield()". Questo ritornerà immediatamente ma invocherà la continuazione non appena viene impostato.
Un'altra opzione, anche se un po 'assurda, consiste nell'implementare il proprio modello attendibile che ha la semantica della segnalazione incompleta finché non viene collegato un callback di continuazione e quindi viene immediatamente completato. Questo in pratica forza la macchina a stati nel percorso asincrono, fornendo la copertura completa.
Per essere sicuri, questa non è una soluzione perfetta. L'aspetto più sfortunato è che richiede la modifica del codice di produzione per affrontare una limitazione di uno strumento. Preferisco di gran lunga che lo strumento di copertura del codice ignori le parti della macchina a stati asincroni generate dal compilatore. Ma finché ciò non accade, non ci sono molte opzioni se si vuole veramente provare a ottenere una copertura completa del codice.
Una più completa spiegazione di questo hack può essere trovato qui: http://blogs.msdn.com/b/dwayneneed/archive/2014/11/17/code-coverage-with-async-await.aspx
fonte
2014-11-19 05:07:46
I metodi sono tutti completando, e le prove stanno passando. Sembra che sto incontrando una limitazione dello strumento. – Jacob
Giusto, ma le operazioni sono già state completate al momento dell '"attesa"? –
Gotcha ... quindi dovresti davvero testare quegli scenari per ogni istanza di attesa? Se avessi un metodo con 5 attese, dovresti scrivere almeno 15 casi di test per ottenere una copertura del 100%? Sembra un insetto per me. Mi sembra più come testare i meccanismi asincroni emessi dal compilatore che testare il tuo codice. – Jacob