Przyczyna, dla której kod nie jest pokazany jako objęty, ma związek ze sposobem implementacji metod asynchronicznych. Kompilator C# faktycznie tłumaczy kod w metodach asynchronicznych na klasę, która implementuje automat stanów i przekształca oryginalną metodę w kod pośredniczący, który zainicjował i wywołał ten automat stanów. Ponieważ ten kod jest generowany w zespole, jest uwzględniany w analizie pokrycia kodu.
Jeśli używasz zadania, które nie jest kompletne w momencie, gdy wykonywany jest kod, maszyna wygenerowana przez kompilator pobiera wywołanie zwrotne zakończenia, aby wznowić po zakończeniu zadania. To w pełni wykorzystuje kod maszynowy stanu i powoduje całkowite pokrycie kodu (przynajmniej dla narzędzi pokrycia kodu na poziomie instrukcji).
Typowy sposób na uzyskanie zadania, które nie jest kompletne w danym momencie, ale zakończy się w pewnym momencie, to użycie Task.Delay w teście jednostki. Jednak jest to zazwyczaj zła opcja, ponieważ opóźnienie czasowe jest albo zbyt małe (i powoduje nieprzewidywalne pokrycie kodu, ponieważ czasami zadanie jest zakończone przed uruchomieniem kodu) lub zbyt duże (niepotrzebnie spowalniające testy w dół).
Lepszym rozwiązaniem jest użycie opcji "czekaj na Task.Yield()". To nastąpi natychmiast, ale wywołaj kontynuację, gdy tylko zostanie ustawiona.
Inną opcją - choć nieco absurdalną - jest wdrożenie własnego, godnego zaufania wzorca, który ma semantykę raportowania niekompletną, dopóki połączenie zwrotne nie zostanie nawiązane, a następnie natychmiast zakończone. To zasadniczo zmusza komputer stanu do ścieżki asynchronicznej, zapewniając pełne pokrycie.
Oczywiście nie jest to idealne rozwiązanie.Najbardziej niefortunnym aspektem jest to, że wymaga modyfikacji kodu produkcyjnego w celu ograniczenia ograniczenia narzędzia. Wolałbym, aby narzędzie zasięgu kodu ignorowało części maszyny asynchronicznej generowane przez kompilator. Ale do tego czasu nie ma zbyt wielu opcji, jeśli naprawdę chcesz spróbować uzyskać pełny zasięg kodu.
Pełniejsze wyjaśnienie tego hack, można znaleźć tutaj: http://blogs.msdn.com/b/dwayneneed/archive/2014/11/17/code-coverage-with-async-await.aspx
Od swojej 'metody async' robi nic innego niż zadania nie wrócić, po prostu stwierdzić, że makiety z' Service' nazwano. Nie ma potrzeby testowania czegokolwiek innego, testy jednostek wewnątrz twojej klasy "service" już obejmują jej zachowanie. Jeśli masz wartość zwracaną, istnieje sposób na wyśmiewanie klas metodami asynchronicznymi. –