Ich habe so etwas in einem der alten und älteren Projekte gesehen, in denen ich gearbeitet habe, die keine Schnittstellen oder Best Practices enthalten, und es ist auch zu schwierig, sie zu erzwingen, Dinge neu zu erstellen oder den Code aufgrund der Reife des Projektgeschäfts umzugestalten In meinem UnitTest-Projekt habe ich einen Wrapper über die Klassen erstellt, die ich verspotten möchte, und die Wrapper-Implementierungsschnittstelle, die alle meine benötigten Methoden enthält, die ich einrichten und mit denen ich arbeiten möchte. Jetzt kann ich den Wrapper anstelle der realen Klasse verspotten.
Zum Beispiel:
Zu testender Dienst, der keine virtuellen Methoden oder Implementierungsschnittstellen enthält
public class ServiceA{
public void A(){}
public String B(){}
}
Wrapper zu moq
public class ServiceAWrapper : IServiceAWrapper{
public void A(){}
public String B(){}
}
Die Wrapper-Schnittstelle
public interface IServiceAWrapper{
void A();
String B();
}
Im Unit-Test können Sie nun den Wrapper verspotten:
public void A_Run_ChangeStateOfX()
{
var moq = new Mock<IServiceAWrapper>();
moq.Setup(...);
}
Dies ist möglicherweise nicht die beste Vorgehensweise, aber wenn Ihre Projektregeln Sie auf diese Weise zwingen, tun Sie es. Fügen Sie außerdem alle Ihre Wrapper in Ihr Unit-Test-Projekt oder Helper-Projekt ein, das nur für die Unit-Tests angegeben wurde, um das Projekt nicht mit nicht benötigten Wrappern oder Adaptern zu überladen.
Update:
Diese Antwort stammt aus mehr als einem Jahr, aber in diesem Jahr habe ich viele ähnliche Szenarien mit unterschiedlichen Lösungen gesehen. Zum Beispiel ist es so einfach, mit Microsoft Fake Framework Mocks, Fakes und Stubs zu erstellen und sogar private und geschützte Methoden ohne Schnittstellen zu testen. Sie können lesen: https://docs.microsoft.com/en-us/visualstudio/test/isolating-code-under-test-with-microsoft-fakes?view=vs-2017