Kurs TDD cz. 13: Testowanie wywołań asynchronicznych (async await)

C# 5.0 wniósł wiele dobroci, m.in. obsługę wywołań asynchronicznych za pomocą słów kluczowych async i await. Rozwiązanie, ze względu na prostotę obsługi i skuteczność, cieszy się do dziś sporą popularnością. Jak testować wywołania asynchroniczne? Tego dowiemy się w tym odcinku!

Załóżmy, że nasza metoda testowa to asynchroniczne wywołanie dzielenia (na potrzeby artykułu, dodaliśmy wywołanie Task.Delay):

public async Task<float> DivideAsync(double dividend, double divisor)
{
    if (divisor == 0) throw new DivideByZeroException();

    await Task.Delay(millisecondsDelay: 1000)
              .ConfigureAwait(continueOnCapturedContext: false);

    return (float)dividend/(float)divisor;
}

W jaki sposób możemy napisać testy do powyższego kodu?

Sposób 1: standardowy

Najprostszy sposób przetestowania asynchronicznej metody przedstawiony jest poniżej:

[Test]
public async void DivideAsyncTest()
{
    var calculator = new Calculator();
    float quotient = await calculator.DivideAsync(10, 2);
    Assert.That(quotient, Is.EqualTo(5));
}

Sposób 2: async await i wyrażenie lambda

Drugim sposobem jest wykorzystanie wyrażeń lambda w kontekście wywołań asynchronicznych:

[Test]
public void DivideAsyncLambdaTest()
{
    var calculator = new Calculator();
    Assert.That(async () => await calculator.DivideAsync(10, 2), Is.EqualTo(5));
}

Testowanie wyjątków

Aby przetestować czy asynchroniczna metoda rzuca wyjątek, możemy wykorzystać wyrażenie lambda. Tutaj test będzie wyglądać następująco:

[Test]
public void WhenDivisorIsZero_ThenDivideByZeroExceptionIsThrown()
{
    var calculator = new Calculator();
    Assert.Throws<DivideByZeroException>(async () => await calculator.DivideAsync(10, 0));
}

Na koniec

Baczny czytelnik powinien zauważyć, że najpierw napisaliśmy kod, a później testy. W tym przypadku omawiamy jednak techniczne aspekty testów jednostkowych; pisząc kod nie zapominajmy o kolejności najpierw testy, później logika biznesowa.

Kod źródłowy z tej części kursu jest dostępny na GitHubie: https://github.com/dariusz-wozniak/TddCourse/.

Źródła

2 thoughts on “Kurs TDD cz. 13: Testowanie wywołań asynchronicznych (async await)

  1. Pingback: dotnetomaniak.pl
  2. Pingback: Kurs TDD – update źródeł | DariuszWoźniak .NET

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s