xUnit n'attend pas async test
Sur VS 2013, je ne peux pas obtenir ce async test à l'échec.
J'ai xUnit 1.8.0.1539 (installé à partir de nuget), avec le testeur xUnit VS extension (0.99.5). Tous les cours, autant que je sache.
Il m'arrive d'avoir aussi Moq, AutoFixture, et FluentAssertions de référence dans l'unité de test, mais je ne pense pas que les questions (mais je suis à l'admettre dans le cas où il n').
J'ai fait async tests unitaires dans d'autres domaines de ma solution, et ils travaillent.
Je suis absent quelque chose avec ce nouveau tests, et je ne peux pas dire ce que je suis absent ou faire du tort.
NOTE Le SUT code n'est pas destiné à être complet. Je suis juste essayer d'obtenir de la lumière rouge d'abord, avant d'écrire le code pour faire le test de passer au vert.
Voici le code de test:
using System.Threading.Tasks;
using FluentAssertions;
using Xunit;
namespace MobileApp.Proxy.Test
{
public class WhenRetrievingPriceDataFromClient
{
[Fact]
public async Task GroupReportIsReturnedWithSomeData()
{
//arrange
var sut = new Client();
//act
var actual = await sut.GetReportGroupAsync();
//assert
//Xunit test
Assert.Null(actual);
Assert.NotNull(actual);
//FluentAssertions
actual.Should().BeNull();
actual.Should().NotBeNull();
}
}
}
Et voici le SUT code:
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;
using MobileApp.Proxy.Properties;
namespace MobileApp.Proxy
{
public class Client
{
public async Task<ReportGroup> GetReportGroupAsync()
{
return await Task.FromResult(new ReportGroup());
}
}
}
Évidemment, ce test échoue! La déclare Nulle et NotNull ne peut pas réussir, donc ma conclusion est que le test est sortie avant la fin de l'obtention de la réponse de la CUS.
Qu'ai-je manqué?
OU, est-il une meilleure façon que j'aurais du commencer un async test pour s'assurer qu'il ne parvient pas avant d'écrire le SUT code?
OriginalL'auteur Alan McBee - MSFT | 2014-04-08
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin xUnit 1.9 pour
async
de tests unitaires pour fonctionner correctement.OriginalL'auteur
Async tests sont pris en charge dans xUnit v1.9 ou plus tard. Si vous êtes coincé avec une version antérieure, vous aurez besoin de faire quelque chose comme ceci:
Fondamentalement, la méthode de test des blocs jusqu'à ce que l'asynchrone de la méthode de test est terminée, que ce en raison de la réussite ou de l'anomalie (par exemple, un échec d'assertion). Dans le cas d'une faute, les exceptions propagées à l'épreuve principale du fil à travers
Wait()
.Vous pouvez vous passer d'un délai de
Wait()
de sorte que votre test échouera s'il n'est pas terminé après un certain laps de temps. Comme l'écrit, le test pourrait bloquer indéfiniment si la méthode async ne se termine jamais.Pas de. Le
Wait()
méthode des blocs jusqu'à ce que la tâche est terminée. Leawait
mot-clé fondamentalement indique au compilateur "reprendre l'exécution du code suivant après cette tâche est terminée". Lorsque que le code continue, et sur ce fil, est déterminée par le type d'objet que vous êtes en attente (dans ce cas, unTask
). Si vous utilisezawait
depuis le thread principal, vous pouvez finir par sortir avant la fin de la tâche.La droite. Et je vais essayer cette. Mais j'ai été amené à croire que le Xunit prend en charge async tests. (et oui, je sais que vous avez dit que vous ne l'utilisez pas).
Basé sur le lien dans la réponse de Stephen, il semble async test à l'appui a été ajouté dans xUnit v1.9. Le lien dit aussi que mon approche est la voie à suivre pour les versions antérieures.
Cette approche sera susceptible de provoquer des blocages si il y a un contexte de synchronisation défini lors de l'appel de ces méthodes.
OriginalL'auteur