Wpis z mikrobloga

Mirki, przerabiam sobie kurs C# na Pluralsight ( C# Fundamentals 7/3 ), mamy takie zadanko, aby zrobić test jednostkowy, sprawdzający, czy ocena do klasy Book może zostać dodana, jak poniżej.

public void AddGrade(double grade)
{
if (grade <= 100 && grade >= 0)
{
grades.Add(grade);
}
else { Console.WriteLine("Invalid Value."); }

Wiem, że to działa prawidłowo i nie dodamy np. oceny 105, ale nie wiem jak do tego napisać test jednostkowy. Próbowałem na zasadzie, Asserts.Equal(105, Book.grades[0]), no ale to nie pyka, bo przecież Book.grades[0] nie będzie istnieć, jeżeli spróbuje temu nadać wartość powyżej 100.

Mam nadzieję, że udało mi się to dobrze wytłumaczyć. Z godzinę starałem się to zrobić lub znaleźć jakieś wyjaśnienie w internecie, ale nic z tego. Pomocy (,)

#programowanie #csharp
  • 6
@Michian484: Jeżeli masz zrobić test jednostkowy tak napisanej metody (bez jej refaktoryzacji) to szukaj innego kursu.
Testem jednostkowym nie sprawdzasz bezpośrednio efektów ubocznych (zmian w otoczeniu programu - pliki, bazy danych, zdalne serwisy czy jak tutaj konsola). Musisz je oddzielić od aplikacji przez port (interfejs) i adaptery (implementacje) - przy testowaniu będą co najmniej dwa adaptery: jeden to prawdziwa konsola, drugi to mock zapisujący wynik do pamięci, który można odczytać i
@aloucie: @UberRam

Dzięki za odpowiedzi.

Dzięki Waszym propozycjom, napisałem to w ten sposób:

[Fact]
public void DoesIfStatementWorkCorrectly()
{
var book = new Book("");
book.AddGrade(105);
Assert.Equal(0, book.grades.Count);

Generalnie działa, ale wyświetla mi się ostrzeżenie:
'Do not use Assert.Equal() to check for collection size.'

Niestety nie wiem na tym etapie, jak to rozwiązać inaczej. Generalnie nie widzę żadnego sensu pisania testu dla takiej instrukcji IF - raczej mam pewność, że to działa poprawnie.
@Michian484: generalnie testuje sie kontrakty jakie dana jednostka testowana obiecuje spelniac, a nie implementacje tego jak to robi (dlatego zadne wewnetrzne ify nie powinny miec wplywu na kod testu). Implementacja moze sie zmieniac, a Twoje testy testujace kontrakt powinny dzialac niezaleznie od implementacji. Scenariusze testowe pisane sa wedlug konktraktu, np. zeby pokryc wartosci brzegowe (a nie to ze sa spelnione w implementacji w postaci ifow).