Widziałem wiele odpowiedzi dotyczących "jak zapełniać swoje klasy, aby można było kontrolować, co dzieje się w ramach SUT".C stubbing. Interfejs dla każdego testowalnego obiektu?
Mówią jedno:
Załóż interfejs i wstrzyknąć tego interfejsu za pomocą iniekcji zależność i stworzyć namiastkę, przy użyciu tego samego interfejsu, który następnie wstrzyknąć do SUT.
Jednak to, co nauczyłem się w moich poprzednich miejscach pracy:
Jeżeli testów jednostkowych, testowanie wszystkie Zajęcia/funkcjonalności.
Czy to znaczy, że dla każdej klasy, która posiada specyficzną funkcję DTP trzeba utworzyć interfejs?
Oznaczałoby to, że ilość klas/plików byłaby zaledwie dwa razy większa.
Jak widać w poniższym przykładzie, czy jest to "droga do wyjścia", czy też brakuje mi czegoś w procesie testowania jednostki?
Na marginesie: Używam Express VS2012. Oznacza to brak ram "Fake'a". Korzystam ze standardowej struktury testowania jednostek VS2012.
Jako bardzo, bardzo prosty przykład, który pozwala mi na otarcie każdego interfejsu przekazanego do maszyny.
IFoo.cs
public interface IFoo
{
string GetName();
}
Foo.cs
public class Foo : IFoo
{
public string GetName()
{
return "logic goes here";
}
}
IBar.cs:
public interface IBar : IFoo
{
IFoo GetFoo();
}
Bar.cs:
public class Bar : IBar
{
public string GetName()
{
return "logic goes here";
}
public IFoo GetFoo()
{
return null; // some instance of IFoo
}
}
IBaz.cs:
public interface IBaz
{
IBar GetBar();
}
Baz.cs:
public class Baz
{
public IBar GetBar()
{
return null; // some instance of IBar
}
}
Moja rada: znajdź dobre szydercze ramy (Moq jest dobrym wyborem), które nie wymagają tworzenia wszystkich tych interfejsów. –
Pójdę rzucić okiem na ten framework –
@RobertHarvey: w jaki sposób Moq pomoże uniknąć tworzenia interfejsów? OP nadal musi pozostawić dla niego punkty wejścia (Moq), czy to wirtualne elementy czy interfejsy. –