Pourquoi les tests unitaires «async void» ne peuvent-ils pas être reconnus?

async void tests d’unité async void ne peuvent pas être exécutés dans Visual Studio 2012:

 [TestClass] public class MyTestClass { [TestMethod] public async void InvisibleMyTestMethod() { await Task.Delay(1000); Assert.IsTrue(true); } } 

Si je veux avoir un test unitaire asynchrone, la méthode de test doit renvoyer une tâche:

 [TestMethod] public async Task VisibleMyTestMethod() { await Task.Delay(1000); Assert.IsTrue(true); } 

Pourquoi est-ce le cas? Ce n’est pas que j’ai absolument besoin d’une méthode de test async void , je suis juste curieux. Visual Studio 2012 ne fournit ni avertissement ni erreur lorsque vous async void une méthode de test async void même si elle ne peut pas être exécutée …

async void méthodes async void doivent être considérées comme “Fire and Forget” – il n’y a aucun moyen d’attendre qu’elles se terminent. Si Visual Studio devait démarrer l’un de ces tests, il ne serait pas en mesure d’attendre la fin du test (le marquer comme réussi) ou d’intercepter les exceptions éventuelles.

Avec une async Task , l’appelant peut attendre l’exécution de l’exécution et intercepter toutes les exceptions déclenchées pendant son exécution.

Voir cette réponse pour plus de discussion sur async void vs async Task .

C’est juste parce que MSTest ne supporte pas les tests d’unité async void . Il est possible de le faire en introduisant un contexte dans lequel ils peuvent s’exécuter.

MSTest ne supporte pas cela, probablement parce que Microsoft a décidé qu’il s’agissait d’un changement trop important pour les tests existants (il est possible que les tests existants soient bloqués s’ils recevaient un contexte inattendu).

Il n’y a pas d’avertissement / erreur du compilateur car c’est du code C # parfaitement valide. La seule raison pour laquelle cela ne fonctionne pas est à cause du framework de test unitaire (je pense que xUnit supporte les tests async void ), et ce serait une violation flagrante de la séparation des préoccupations pour que le compilateur C # puisse regarder vos atsortingbuts, Déterminez que vous utilisez MSTest et décidez que vous ne voulez vraiment pas utiliser async void .

J’ai trouvé dans VS2015 que toutes les méthodes de test décorées avec async ne seraient pas affichées dans Test Explorer. J’ai fini par supprimer le mot-clé async et remplacer l’appel en attente dans le test par une tâche.Wait () et j’ai effectué mes assertions sur task.Result.

Semble fonctionner correctement. Je ne l’ai pas encore essayé avec les tests d’exception.

 var task = TheMethodIWantToTestAsync(someValue); task.Wait(); var response = task.Result; Assert.IsNotNull(response); Assert.IsTrue(response.somevalue);