die folgende KlasseWie erstellt man eine Schnittstelle, die einige interne Methoden zum Testen in C# enthält? Betrachten
public class Entity {
public void Foo() { ... }
internal void Bar() { ... }
}
Wie Sie es sehen hat eine public
Verfahren und eine internal
Methode. Jetzt möchte ich eine Schnittstelle erstellen, die es mir erlaubt, diese Klasse in Tests (sowohl in dieser Assembly als auch in anderen) zu verspotten. Ich schreibe meinen Code wie folgt um:
public interface IEntity {
void Foo();
}
internal class Entity : IEntity {
public void Foo() { ... }
public void Bar() { ... }
}
Allerdings schafft dies ein anderes Problem. Wenn die Klasse in einem anderen Verfahren in der gleichen Baugruppe verwendet, kann ich nicht Bar
mehr nennen:
public class OtherClass {
public void SomeMethod(IEntity entity) {
entity.Bar(); // error!
}
}
den Code wie folgt Umschreiben:
public class OtherClass {
public void SomeMethod(IEntity entity) {
(entity as Entity).Bar(); // error in test!
}
}
einen Fehler in dem Unit-Test auslösen, die SomeMethod
auslöst . Wie überschreibe ich meinen Code, so dass ich immer noch internal
Methoden in derselben Assembly verwenden kann und trotzdem öffentliche Member anderen Assemblys zugänglich machen?
Update: Klasse OtherClass
ist ein Utility-Klasse, die auf Interna der Entity
Klasse arbeiten muss, die direkt an die Nutzer ausgesetzt sind, nicht. Diese Klasse selbst ist jedoch Benutzern zugänglich, so dass sie indirekt Zugriff auf Interna der Entity
haben. Dies ist erwünscht, da SomeMethod
notwendige Überprüfungen durchführt, um sicherzustellen, dass Benutzer den internen Zustand eines Entity
Objekts nicht vermasseln.
Warum machen Sie die Methoden nicht einfach virtuell, anstatt eine Schnittstelle zu erstellen? – adrianm
@adrianm: Weil ich auch eine klare Schnittstelle für die Benutzer wünsche, nicht mit privaten/internen Mitgliedern und Implementierung verwechselt werden. Und auch, weil ich in Zukunft gerne eine andere Implementierung bereitstellen würde, ohne alle abhängigen Projekte neu aufzubauen. In Anbetracht all der Schwierigkeiten, die Schnittstellen im Umgang mit internen Mitgliedern verursachen, kann ich diese Option trotz der oben genannten Vorteile wählen. –