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.

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