Spotkałem się z czymś takim w jednym ze starych i starszych projektów, w którym pracowałem, który nie zawiera żadnych interfejsów ani najlepszych praktyk, a także jest zbyt trudne, aby wymusić na nich ponowne tworzenie rzeczy lub refaktoryzację kodu ze względu na dojrzałość biznesową projektu, więc w moim projekcie UnitTest tworzyłem Wrapper na klasach, które chcę mockować, i interfejs implementacji opakowania, który zawiera wszystkie moje potrzebne metody, które chcę skonfigurować i pracować z nimi. Teraz mogę wyszydzać opakowanie zamiast prawdziwej klasy.
Na przykład:
Usługa, którą chcesz przetestować, która nie zawiera metod wirtualnych ani interfejsu implementacji
public class ServiceA{
public void A(){}
public String B(){}
}
Wrapper do moq
public class ServiceAWrapper : IServiceAWrapper{
public void A(){}
public String B(){}
}
Interfejs Wrapper
public interface IServiceAWrapper{
void A();
String B();
}
W teście jednostkowym możesz teraz mockować opakowanie:
public void A_Run_ChangeStateOfX()
{
var moq = new Mock<IServiceAWrapper>();
moq.Setup(...);
}
Może to nie jest najlepsza praktyka, ale jeśli reguły Twojego projektu narzucają Ci to w ten sposób, zrób to. Ponadto umieść wszystkie opakowania w projekcie testu jednostkowego lub projekcie pomocnika określonym tylko dla testów jednostkowych, aby nie przeciążać projektu niepotrzebnymi opakowaniami lub adapterami.
Aktualizacja:
Ta odpowiedź od ponad roku, ale w tym roku spotkałem się z wieloma podobnymi scenariuszami z różnymi rozwiązaniami. Na przykład tak łatwo jest używać Microsoft Fake Framework do tworzenia mocków, fake i stubów, a nawet testowania prywatnych i chronionych metod bez żadnych interfejsów. Możesz przeczytać: https://docs.microsoft.com/en-us/visualstudio/test/isolating-code-under-test-with-microsoft-fakes?view=vs-2017