Noda Time: testy jednostkowe oraz obsługa czasu

W dzisiejszym poście pokażę bibliotekę Noda Time. Generalnie jest ona stworzona, aby zastąpić DateTime, który często powoduje problemy. Dzisiaj jednak, chciałbym pokazać Noda Time na przykładzie testów jednostkowym, bo to jest miejsce, gdzie DateTime po prostu nie nadaje się do użycia (przynajmniej bezpośrednio).

Załóżmy, że mamy w kodzie taką metodę:

class Sample { public void DoSomething(DateTime dateTime) { DateTime now = DateTime.Now; if(dateTime>now) Console.WriteLine("{0}>{1}",dateTime,now); else Console.WriteLine("{0}<={1}", dateTime, now); } }

Przykład, jak to zwykle na tym blogu bez sensu, ale chodzi mi o odwołanie do DateTime.Now. Jak teraz taką metodę można przetestować? Jednym rozwiązaniem (brzydkim) jest użycie Microsoft Fakes – http://www.pzielinski.com/?p=2066.

W praktyce, odradzam Shims i zawsze powinniśmy preferować stub’y\mock’i. Zainstalujmy NodaTime i zobaczymy jak można to naprawić:

class Sample { private readonly IClock _clock; public Sample(IClock clock) { _clock = clock; } public void DoSomething(Instant dateTime) { Instant now = _clock.Now; if(dateTime>now) Console.WriteLine("{0}>{1}",dateTime,now); else Console.WriteLine("{0}<={1}", dateTime, now); } }

Widzimy, że nie mamy żadnych statycznych wywołań. IClock reprezentuje abstrakcję czasu. Możemy wstrzyknąć zegar systemowy lub mock, co zrobimy zaraz w teście:

var fakeClock = Substitute.For<IClock>(); fakeClock.Now.Returns(Instant.FromUtc(2013, 1, 2, 0, 0)); Sample sample = new Sample(fakeClock); sample.DoSomething(Instant.FromUtc(2013,1,1,0,0));

Możemy również użyć czasu systemowego:

Sample sample = new Sample(SystemClock.Instance); sample.DoSomething(Instant.FromUtc(2013,1,1,0,0));

Myślę, że każdy z nas pisał wrapper’y na DateTime w celu implementacji testów jednostkowych. Dzięki Noda Time nie musimy tego robić i dostajemy ponadto kilka innych możliwości manipulowaniem czasem, którego brakowało w standardowym DateTime.

2 thoughts on “Noda Time: testy jednostkowe oraz obsługa czasu”

  1. Noda Time to nie tylko wstrzykiwanie zaleznosci, ale jesli tylo to akurat jest potrzebne to mysle, ze statyczna klasa uprosci wiele spraw.

Leave a Reply

Your email address will not be published.