Nunit, testowanie WebClient

0

Jak zrobić testy jednostkowe dla poniższej metody:

public void Download(string url, string fileName)
{
    {
        try
        {
             WebClient client = new WebClient();
             client.DownloadFile(url, fileName);
        }
        catch (WebException webEx)
        {                                     
               //
        }            
    }     
} 

Długo już nad tym siedzę, google niewiele mi mówi. Proszę o nakierowanie, jakąkolwiek pomoc. Wydaje mi się bezsensu testowanie czegoś takiego.

1
interface IWebClient {
  FileData DownloadFile(Url url, String filename);
}

public class WebClient : IWebClient { ... }

public class TwojaKlasa {
  private readonly IWebClient _webClient;

  TwojaKlasa(IWebClient webClient) {
    _webClient = webClient;
  }

  public void TwojaMetoda(string url, string filename) {
    var fileData = _webClient.DownloadFile(new Url(url), filename);
    // zrob cos z tym...
  }
}

I teraz testujesz sobie tylko czy odpowiednie metody zostaly wykonane w odpowiedniej kolejnosci. A implementacje WebClient robi tylko wywolanie odpowiedniej metody z liba.

0

Czytałem o tym w The Art of Unit Testing. Ale nie potrafiłem tego połączyć z tą metodą. Dzięki.

0

Tylko po co ja mam testować w taki sposób metodę która tylko pobiera, przecież to jest uwolnienie się od zależności od niej i zastąpienie jakimś fakiem, a jej nie da się przetestować? Jeżeli ta metoda jest wykorzystywana np. przez inną wtedy to ma sens. A co na przykład z metodami, które zapisują lub odczytują coś z pliku? Wykorzystać resources? To testy integracyjne powinny sprawdzać czy na przykład pobrany plik jest prawidłowy, czy to pobieranie działa właściwie?

1

a jej nie da się przetestować?

Da sie, ale to nie beda juz testy jednostkowe. Odpal jakis serwer z plikami do testow, ktory jest mozliwie najmniej awaryjny i po prostu pobierz ten plik z niego i sprawdz czy sie dobrze pobral.

0

Rozumiem, że na przykład testowanie metody wczytującej dane z pliku na dysku w taki sposób, że wczytujemy te dane i porównujemy z danymi testowymi to jest test integracyjny?

1

Tak, wszystkie testy, które korzystają z plików, sieci, baz danych, itp. to testy integracyjne.

0

A jeżeli mamy na przykład 2 metody w klasie, dla których trzeba zrobić ten myk i dodatkowo w konstruktorze 3 parametry , więc w sumie mamy 5 parametrów w konstruktorze. Nie zaczyna to za mocno puchnąć? Jest to poprawne?

0

I kazda jedna metoda wymaga tych 5 rzeczy? Bo wtedy to bym sie zastanowil, czy te metody nie robia za duzo. Jesli nic takiego sie nie dzieje, to nie trzeba mockowac calosci do jednego testu, a rozbijanie zaleznosci tak czy siak warto zrobic.

0

Nie każda jedna nie. Na przykład w jednej z klas jedna metoda wymaga 5, a pozostałe po 1.

0

Ja się tak zastanawiam co tu testować jednostkowo? Sam proces pobierania, opakujemy w jakiś interfejs i testujemy czy metody interfejsu zostały wywołane w odpowiedniej kolejności? Raczej jest to kiepski pomysł. Szczególnie, że metoda jest jedna. Można by jednostkowo przetestować sytuację co się stanie gdy coś się wywali, czyli czy prawidłowo obsłużyliśmy wyjątek (przekazaliśmy do góry, wrzuciliśmy na jakąś kolejkę itp.). Wtedy OK, ale tu nie ma miejsca na testy jednostkowe, a jeżeli już się je napisze, to będą albo powtórzeniem kodu funkcjonalności, albo niczego konkretnego nie przetestują (ale zapewnią pokrycie).

0

Ja się tak zastanawiam co tu testować jednostkowo?

To czy metoda robiaca cos z danymi z pliku robi to z danymi z pliku.

0

Ok, ale mamy tu samo pobieranie. Zapakowane w metodę. I tyle. Nie ma nic o parsowaniu czy obróbce pliku.

0

No niezupelnie, jasno wskazalem ze pobieranie powinno byc wyniesione do implementacji interfejsu, a ta metoda powinna cos robic z otrzymywanymi danymi.

0

Klasę Fake_cośtam : IWebClient mam umieszczać w projekcie cośtam_UnitTests czy w projekcie właściwym? Wydaje mi się, że tam gdzie mam testy.

0

Zapoznaj sie z koncepcja mockowania. Ja osobiscie uzywam biblioteki moq do tego. Wtedy potrzeba tworzenia klasy takiej zniknie.

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