Kiedy używać mocking versus faking w C# unit testing?

Czy ktoś może wymyślić wytyczne sugerujące idealne scenariusze wyboru wyśmiewania a udawania, czyli ręcznego konfigurowania podstawowych rzeczy?

Jestem trochę zdezorientowany, jak podejść do tej sytuacji.

Author: Rap, 2009-09-14

4 answers

Masz kilka rzeczy do załatwienia. Masz dwie podstawowe rzeczy, które musisz wiedzieć: Nomenklatura i najlepsze praktyki.

Najpierw chcę dać ci świetny zasób Wideo od świetnego testera, Roya Osherove ' a:

Recenzje testów jednostkowych Roy Osherove

Zaczyna od tego, że ma zrobiłem kilka recenzji uprzęży testowych dostarczany z kilkoma open source projekty. Znajdziesz je tutaj: http://weblogs.asp.net/rosherove/archive/tags/TestReview/default.aspx

To są w zasadzie Recenzje wideo gdzie prowadzi cię przez te testy uprzęże i mówi, co jest dobre i co jest złe. Bardzo pomocne.

Roy ma też książkę, którą Rozumiem. jest bardzo dobry.

Nomenklatura

Ten podcast pomoże : http://www.hanselminutes.com/default.aspx?showID=187

Parafrazuję podcast, choć (że Hanselminutes Intro music jest straszne): {]}

W zasadzie wszystko, co robisz z isolation framework (Jak Moq, Rhino Mocks, Type Mock, etc) nazywa się fake .

A fake jest obiektem używanym podczas test, który testujesz kod może wywołać zamiast kodu produkcji. Podróbka służy do wyizolowania kodu próbują przetestować z innych części Twoje podanie.

Istnieją (głównie) dwa rodzaje podróbek: stuby i wyśmiewa .

A mock to podróbka, którą wkładasz umieść tak, aby kod, który testujesz można wołać, a ty twierdzisz, że połączenie zostało wykonane z prawidłowym parametry. Poniższa próbka nie tylko to za pomocą izolacji Moq framework:

[TestMethod]
public void CalculateTax_ValidTaxRate_DALCallIsCorrect()
{
    //Arrange
    Mock<ITaxRateDataAccess> taxDALMock = new Mock<ITaxRateDataAccess>();
    taxDALMock.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08).Verifiable();

    TaxCalculator calc = new TaxCalculator(taxDALMock.Object);

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    taxDALMock.VerifyAll();
}

A stub jest prawie taki sam jak mock, z tym, że umieściłeś go w miejscu aby upewnić się, że kod jesteś testowanie odzyskuje spójne dane z jego call (na przykład, jeśli twój kod dzwoni warstwy dostępu do danych, stub byłby powrót fałszywych danych), ale nie / align = "left" / Że jest, nie zależy Ci, aby zweryfikować, że metoda zwana fałszywym dostępem do danych layer – próbujesz przetestować coś innego. Zapewniasz stub aby uzyskać metodę, którą próbujesz test do pracy w izolacji.

Oto przykład ze stubem:

[TestMethod]
public void CalculateTax_ValidTaxRate_TaxValueIsCorrect()
{    
    //Arrange
    Mock<ITaxRateDataAccess> taxDALStub = new Mock<ITaxRateDataAccess>();
    taxDALStub.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08);

    TaxCalculator calc = new TaxCalculator(taxDALStub.Object); 

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    Assert.AreEqual(result, 8.00);
}

Zawiadomienie tutaj testujemy wyjście metody, a nie fakt, że metoda wywołała kolejny zasób.

Moq tak naprawdę nie tworzy API rozróżnienie między makietą a stubem (Uwaga obie zostały zadeklarowane jako Mock<T>), ale użycie tutaj jest ważne przy określaniu typu.

Mam nadzieję, że to pomoże Cię wyprostować.
 81
Author: Anderson Imes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-19 19:38:17

Istnieje co najmniej 5 różnych rodzajów sobowtórów testowych: manekiny, stuby, kpiny, szpiedzy i podróbki. Dobry przegląd jest na http://code.google.com/testing/TotT-2008-06-12.pdf i są również klasyfikowane w http://xunitpatterns.com/Mocks,%20fakes,%20Stubs%20and%20Dummies.html

 17
Author: Esko Luontola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 22:28:39

Chcesz przetestować kawałek kodu, powiedzmy metodę. Twoja metoda pobiera plik z adresu URL http, a następnie zapisuje plik na dysku, a następnie wysyła wiadomość, że plik znajduje się na dysku. Wszystkie te trzy akcje są oczywiście klasami usług wywołania metody, ponieważ wtedy są one łatwe do wyśmiewania. Jeśli nie wyśmiewasz ich, twój test pobierze rzeczy, uzyska dostęp do dysku i wyśle wiadomość za każdym razem, gdy uruchomisz ten test. Wtedy nie tylko testujesz kod w metodzie, ale także testujesz kod, który pobiera, zapisuje na dysk i wysyła pocztę. Teraz, jeśli wyśmiewasz się z nich, testujesz tylko kod metod. Możesz również symulować na przykład błąd pobierania, aby sprawdzić, czy kod Twojej metody zachowuje się poprawnie.

A co do udawania, to zwykle podrabiam klasy, które trzymają wartości i nie mają zbyt wiele logiki. Jeśli wysyłasz obiekt, który zawiera pewne wartości, które zostaną zmienione w metodzie, możesz odczytać z niego w teście, aby zobaczyć, że metoda postępuj słusznie.

Oczywiście zasady mogą (a czasem muszą) być nieco wygięte, ale ogólnym sposobem myślenia jest testowanie kodu i tylko kodu.

 1
Author: crunchdog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 05:05:11

The Little Mocker , Bob Martin, jest bardzo dobrą lekturą na ten temat.

[...] dawno temu niektórzy bardzo mądrzy ludzie napisali artykuł, który wprowadził i zdefiniował termin Mock Object. Wiele innych osób przeczytało go i zaczęło używać tego terminu. Inni ludzie, którzy nie czytali gazety, usłyszeli termin i zaczęli używać go w szerszym znaczeniu. Zamienili nawet słowo w czasownik. Mówili: "wyśmiewajmy ten przedmiot.", lub " mamy wiele wyśmiewania się z zrób."

Artykuł wyjaśnia różnice między mockami, podróbkami, Spy i stubami.

 1
Author: Benoit Blanchon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 14:35:19