Wie erstelle ich eine Schnittstelle, die einige Methoden zum Testen in C # intern hält?

Betrachten Sie die folgende Klasse

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

Wie Sie sehen, hat es einepublic Methode und eininternal Methode. Jetzt möchte ich eine Schnittstelle erstellen, mit der ich diese Klasse in Tests (sowohl in dieser als auch in anderen Assemblys) verspotten kann. Ich schreibe meinen Code wie folgt um:

public interface IEntity {
  void Foo();
}

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

Dies schafft jedoch ein anderes Problem. Wenn ich die Klasse in einer anderen Methode in derselben Assembly verwende, kann ich sie nicht aufrufenBar nicht mehr:

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

Umschreiben des Codes wie folgt:

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

wird einen Fehler im Unit-Test auslösen, der auslöstSomeMethod. Wie schreibe ich meinen Code um, damit ich ihn weiterhin verwenden kann?internal Methoden in derselben Assembly und doch nur öffentliche Mitglieder anderen Assemblys aussetzen?

Aktualisieren: KlasseOtherClass ist eine Utility-Klasse, die auf Interna derEntity Klasse, die nicht direkt an die Benutzer ausgesetzt sind. Diese Klasse selbst ist jedoch Benutzern ausgesetzt, sodass sie indirekt Zugriff auf Interna der Klasse habenEntity. Dies ist erwünscht alsSomeMethod führt die erforderlichen Überprüfungen durch, um sicherzustellen, dass die Benutzer den internen Status eines nicht vermasselnEntity Objekt.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage