2008-12-08 15 views
17

Używam moq do wyśmiewania obiektów w testach jednostkowych i widziałem na stronie o moq, że jest to w stanie wyśmiewać zarówno klasy, jak i interfejsy.Jaka jest różnica między Moq-ing klasy lub interfejsu?

miałem dyskusję z jednym z moich kolegów z pracy na drugi dzień i stwierdził, że nigdy nie jest powodem do zajęć próbnych i powinienem tylko mock interfejsy.

Tak naprawdę nie miałem na to odpowiedzi ... i nie mogę znaleźć odpowiedzi na to na stronie moq.

Czy to prawda, że ​​nigdy nie należy kpić z klas? Powiedziałbym, że nie, skoro to prawda, to Moq nawet by na to nie pozwolił ... Czy więc jest taki czas, w którym lepiej kpić z klasy niż z interfejsu? Jaka jest różnica między kpiną z klasy a kpiną z interfejsu? Czy naprawdę jest to po prostu kwestia preferencji?

Odpowiedz

16

Kpiny z klasy są całkowicie poprawne. Za pomocą MoQ można kpić tylko z wirtualnych metod i właściwości klasy.

Jest to przydatne, gdy masz abstrakcyjnych klas bazowych zamiast interfejsów lub zajęcia z implementacji standardowych i virtualach jak punkty rozszerzeń. Istnieje wiele przypadków, w których nie masz dostępu do kodu źródłowego klas, których musisz udawać. Istnieje wiele przykładów w środowisku .Net, np. MembershipProvider.

1

Jeśli klasa nie implementuje interfejsu lub jeśli szyderczy ramy umożliwia częściowe mocks wtedy chcesz aby móc szydzić klasę. W pierwszym przypadku, ponieważ nie ma interfejsu do fałszywego. W tym drugim przypadku możesz dziedziczyć istniejące zachowania z klasy, których nie chcesz wyśmiewać.

Zazwyczaj jednak chcesz, aby twoje klasy były zależne od interfejsów, gdy są dostępne. W takim przypadku nie musisz kpić z klasy, która implementuje interfejs. Powinieneś po prostu sfałszować interfejs, aby uniknąć zależności w teście, które nie istnieją w testowanej klasie.