xUnit nicht erwartet async-test
Auf VS 2013, ich kann nicht async-test fehl.
Habe ich xUnit 1.8.0.1539 (Installation über nuget), mit dem xUnit-Test-Runner VS-Erweiterung (0.99.5). Alle aktuellen, AFAIK.
Ich zufällig auch haben Moq, AutoFixture, und FluentAssertions Referenz in das Gerät zu testen, aber ich glaube nicht, dass die Sachen (aber ich bin, es zuzugeben, falls es funktioniert).
Habe ich getan asynchronen unit tests in anderen Bereichen meine Lösung, und Sie funktioniert.
Bin ich etwas fehlt, mit diesem neu erstellten tests, und ich kann nicht sagen, was mir fehlt oder das falsche tun.
HINWEIS SUT code ist nicht dazu gedacht, vollständig zu sein. Ich versuche nur zu bekommen, das rote Licht zuerst, bevor ich den code schreiben, um die Prüfung zu machen, gehen grün.
Hier ist der test-code:
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();
}
}
}
Und hier ist der 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());
}
}
}
Offensichtlich, dieser test sollte fehlschlagen! Die Bestätigungen für Null-und NotNull können nicht zugleich gelingt, so meine Schlussfolgerung ist, dass Sie den test beenden, bevor es endet immer die Antwort des SUT.
Hab ich was verpasst?
ODER gibt es einen besseren Weg, sollte ich angefangen haben, eine async-test, um sicherzustellen, dass es ausfällt, bevor das schreiben der SUT-code?
InformationsquelleAutor Alan McBee - MSFT | 2014-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie müssen xUnit 1.9 für
async
unit-tests, um korrekt zu arbeiten.InformationsquelleAutor Stephen Cleary
Async-tests werden unterstützt in xUnit-v1.9 oder später. Wenn Sie fest sind, die mit einer früheren version haben, brauchen Sie etwas wie das hier tun:
Grundsätzlich die test-Methode blockiert, bis die async-test-Methode abgeschlossen ist, ob es würde aufgrund der erfolgreichen Fertigstellung oder Fehler (z.B. ein Fehler bei assertion). Im Falle einer Störung, die Ausnahmen verbreitet, um die Haupt-test-thread durch
Wait()
.Können Sie wollen, eine timeout zu
Wait()
so Ihre test schlägt fehl, wenn es noch nicht abgeschlossen hat, nach einer gewissen Zeit. Wie geschrieben, konnte der test-block auf unbestimmte Zeit, wenn der async-Methode wird nie abgeschlossen.Nein. Die
Wait()
- Methode blockiert, bis die Aufgabe abgeschlossen ist. Dieawait
keyword im Grunde sagt der compiler "Lebenslauf mit dem folgenden code, nachdem diese Aufgabe abgeschlossen". Wenn dieser code weiterhin, und auf welchem thread, wird bestimmt durch die Art von Objekt, das Sie erwartet (in diesem Fall einTask
). Wenn Sieawait
aus dem Haupt-thread, können Sie am Ende verlassen, bevor die Aufgabe abgeschlossen ist.Recht. Und ich werde versuchen, diese. Aber ich wurde geführt, zu glauben, das Xunit unterstützt asynchronen tests. (und ja, ich weiß, Sie sagte, Sie benutze es nicht).
Basierend auf den link in Stephans Antwort, es scheint async-test-Unterstützung wurde Hinzugefügt, xUnit-v1.9. Der link sagt auch, dass mein Ansatz ist der Weg zu gehen für frühere Versionen.
Dieser Ansatz wird wahrscheinlich zu deadlocks führen, wenn es eine Synchronisierung Rahmen-set für den Aufruf dieser Methoden.
InformationsquelleAutor Mike Strobel