Jak testować metody publiczne?

0

Hej, jakieś pół roku temu pytałem się o zasadność stosowania metod prywatnych w klasach.

Dzisiaj mam pewną zagwozdkę. A mianowicie, jeśli dla przykładu posiadam metodę publiczną:

public Task StartAsync()
        {
            _log.AddLog(DateTime.UtcNow, "Started by client");

            Source = new CancellationTokenSource();
            Token = Source.Token;

            Task.Run(() =>
            {
                _timer = new Timer(StartUpdates, null, TimeSpan.Zero, TimeSpan.FromHours(12));

            }, Token);

            return Task.CompletedTask;
        }

to zastanawiam się, czy: jeśli metoda StartUpdates ma wpływ na własności klasy w których się znajdują, to czy powinienem uwzględnić zmianę tych własności przy testowaniu StartAsync? StartUpdates sama zmienia kilka własności, korzysta też z kilku innych metod prywatnych, które też korzystają z różnych serwisów. Czy testować wszystkie zmiany własności klasy które następują po wywołaniu StartAsync?

2

Testuj zachowania a nie implementację, możliwie na jak najwyższym poziomie. Być może ten StartUpdates to szczegół implementacyjny. Czym z punktu widzenia użytkownika klasy StartAsync skutkuje zmiana wartości tych pól? A może to jest tylko jakiś techniczny „asynchroniczny runner” i logika do przetestowania znajduje się w tym StartUpdates?

Inna sprawa - ten kod jest średnio testowalny (nie znam się na .NET), ponieważ jesteś uzależniony od jakiegoś Timera, więc masz asynchroniczny kod. Wartości też zahardkodowane - będziesz czekał w teście 12 godzin? Dobrym zabiegiem byłoby przekazanie tego Timera w konstruktorze, aby w unit testach podmienić to implementację synchroniczną.

5

Ale co Ty tu chcesz testować? Czy klasy z frameworka działają? No nie wiem czy jest sens. Przetestuj to, co StartUpdates robi, a jak ten proces musi być uruchamiany przez timer, to oddziel go od klasy uruchamiającej.

Druga sprawa - co chcesz osiągnąć odpalając Timer w Tasku?

1 użytkowników online, w tym zalogowanych: 0, gości: 1