Hallo Zusammen
Im Zuge eines privaten Bastelprojektes habe ich mich mit Async und Unit Tests befasst und bin dabei auf ein Problem gestossen. Bzw. eine Situation welche ich einfach nicht verstehe. Ich habe das Problem mal so weit wie möglich heruntergebrochen. Irgendwie stehe ich gerade ein bisschen auf dem Schlauch oder sehe den Wald vor lauter Bäumen nicht?!
Zum Problem:
Ich habe zwei async Unit Tests mit await, wovon allerdings nur einer im Test Explorer von VS2013 gelistet wird. Obwohl, meiner Meinung nach, die Tests "das selbe machen bzw. identisch sind".
Ich komme auch nach intensiver Suche nicht darauf was das Problem ist. Ich denke hier kann mich sicher jemand in die richtige Richtung schicken…?
Folgende Referenzen sind im Projekt:
Gruss
#1pCH
Klassen in der ClassLibrary1
public class CustomClient
{
public async Task<int> GetDataAsync()
{
int data = 4 + 1;
return data;
}
public async Task<CustomClass> GetCustomDataAsync()
{
CustomClass data = new CustomClass();
return data;
}
}
public class CustomClass
{
}
Unit Test in der UnitTests ClassLibrary
[TestFixture]
public class CustomClientUnitTests
{
[Test]
public async Task TestListedInTestExplorer()
{
CustomClient sut = new CustomClient();
var result = await sut.GetDataAsync();
Assert.That(result, Is.EqualTo(6));
}
[Test]
public async Task Test_NOT_ListedInTestExplorer()
{
CustomClient sut = new CustomClient();
var result = await sut.GetCustomDataAsync();
Assert.That(true, Is.False);
}
}
Lass doch das await weg, nimm dir das Task-Objekt und warte mit der Wait-Methode?
await brauchst du hier gar nicht, Visual Studio ruft die sowieso parallel auf.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Deine CustomClient-Klasse ist nicht wirklich async. Nur weil das Wort davor steht heisst das noch lange nicht, dass das dann auch asynchron ist.
Visual Studio sollte Dir hier auch einen Hint anzeigen, dass es am Wort "await" mangelt.
Es macht kein Sinn hier GetData als Async zu definieren; aber der Vollständigkeit halber:
public Task<int> GetDataAsync( ) // Denkt dran: wird nicht asynchron ausgeführt
{
return Task.Run( ( ) =>
{
int data = 4 + 1;
return data;
} );
}
public async Task Do( )
{
var val = await GetDataAsync( ); // hier erfolgt nun die asynchrone Ausführung.
Console.WriteLine( "Value: " + val );
}
Und für die UnitTests einfach das await weglassen und mit Wait() arbeiten.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Palladin007
Besten Dank für deine Antwort.
Was ich bereits versucht habe:
[Test]
public async Task Test_NOT_ListedInTestExplorer()
{
CustomClient sut = new CustomClient();
var resultTask = sut.GetCustomDataAsync();
var result = resultTask.Result;
Assert.That(true, Is.False);
}
Der Unit Tests wird danach auch im Test Explorer angezeigt. Allerdings sollte es ja so genau nicht sein. Der Vorteil ist ja, dass in async Unit Tests, wie im „normalen“ Code, mit async/await gearbeitet werden kann.
Das entspricht alles mehr einem Workaround, als einer Lösung und beantwortet auch nicht die eigentliche Frage. Er erschliesst sich mir nicht, warum der Unit Test 1 angezeigt wird und der Unit Test 2 nicht?
Hallo Abt
Danke für dein Feedback.
Ich habe meinen Code auch stark reduziert um das Problem aufzuzeigen, ohne unnötigen Code. Die CustomClient Klasse ist nur ein Platzhalter, die eigentliche Klasse hat ein paar Zeilen mehr (async) Code. Die Methoden im CustomClient sind als async markiert, auch wenn in diesem Beispiel die Verarbeitung synchron ist (was, wie du angemerkt hast, VS auch als Warnung anzeigt).
Ich habe bereits ein paar Unit Tests mit dem „Workaround“ gemacht, allerdings hinterlässt es ein schlechtes Gefühl.
Und nicht zu wissen warum der zweite Unit Test nicht angezeigt wird lässt mir einfach keine Ruhe. Idee? Input? Anmerkungen?
Gruss
#1pCH