Wie eine Schnittstelle zu erstellen, hält einige Methoden für interne Tests in C#?

Betrachten Sie die folgende Klasse

public class Entity {
  public void Foo() { ... }
  internal void Bar() { ... }
}

Wie Sie sehen, hat es eine public Methode und ein internal Methode. Nun, ich möchte eine Benutzeroberfläche erstellen, die mir erlauben wird, zu verspotten, die diese Klasse in den tests (sowohl in dieser Versammlung und in anderen nicht). Ich umschreiben, mein code wie folgt:

public interface IEntity {
  void Foo();
}

internal class Entity : IEntity {
  public void Foo() { ... }
  public void Bar() { ... }
}

Jedoch, dies schafft ein weiteres Problem. Bei der Verwendung der Klasse in einer anderen Methode in die Versammlung, ich kann nicht mitgehen Bar mehr:

public class OtherClass {
  public void SomeMethod(IEntity entity) {
    entity.Bar(); //error!
  }
}

Den code umschreiben, wie dieses:

public class OtherClass {
  public void SomeMethod(IEntity entity) {
    (entity as Entity).Bar(); //error in test!
  }
}

auslösen wird, ein Fehler in der unit-test auslöst SomeMethod. Wie muss ich meinen code umschreiben, so dass ich weiterhin verwenden können internal Methoden in der gleichen assembly und doch enthüllen nur öffentliche Mitglieder zu anderen Baugruppen?

Update: Klasse OtherClass ist eine utility-Klasse, die Bedürfnisse zu bedienen, die auf Interna der Entity Klasse, die sind nicht ausgesetzt, um die Benutzer direkt. Jedoch, diese Klasse selbst ist für die Benutzer verfügbar gemacht, damit Sie indirekt Zugriff auf Interna der Entity. Dies ist gewünscht, da SomeMethod führen erforderliche Prüfungen durch, um sicherzustellen, dass die Benutzer sich nicht Schraube bis der interne Zustand eines Entity Objekt.

  • Warum gehst du nicht einfach machen, die virtuelle Methoden erstellen, anstatt eine Schnittstelle?
  • Weil ich will auch eine klare Schnittstelle für die Benutzer, nicht gemischt mit privaten/internen Mitgliedern und Umsetzung. Und auch, weil ich möchte in der Lage sein, um eine unterschiedliche Umsetzung der in der Zukunft ohne Umbau alle abhängigen Projekte. Jedoch in Anbetracht all der Schwierigkeiten, welche die Schnittstellen erstellen, wenn der Umgang mit internen Mitgliedern, ich könnte wählen Sie diese option, trotz der oben genannten Vorteile.
Schreibe einen Kommentar