Ich schreibe einen Test, der von den Ergebnissen einer Erweiterungsmethode abhängt, aber ich möchte nicht, dass ein zukünftiger Fehler dieser Erweiterungsmethode diesen Test jemals bricht. Das Verspotten dieses Ergebnisses schien die naheliegende Wahl zu sein, aber Moq scheint keine Möglichkeit zu bieten, eine statische Methode zu überschreiben (eine Voraussetzung für eine Erweiterungsmethode). Es gibt eine ähnliche Idee mit Moq.Protected und Moq.Stub, aber sie scheinen für dieses Szenario nichts zu bieten. Vermisse ich etwas oder sollte ich das anders machen?
Hier ist ein triviales Beispiel, das mit der üblichen "Ungültige Erwartung an ein nicht überschreibbares Mitglied" fehlschlägt . Dies ist ein schlechtes Beispiel dafür, wie man eine Erweiterungsmethode verspotten muss, aber es sollte reichen.
public class SomeType {
int Id { get; set; }
}
var ListMock = new Mock<List<SomeType>>();
ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5))
.Returns(new SomeType { Id = 5 });
Wie bei allen TypeMock-Junkies, die vorschlagen könnten, stattdessen Isolator zu verwenden: Ich schätze den Aufwand, da TypeMock anscheinend die Arbeit mit verbundenen Augen und betrunken erledigen kann, aber unser Budget steigt nicht so schnell.
quelle
Antworten:
Erweiterungsmethoden sind nur verschleierte statische Methoden. Das Verspotten von Frameworks wie Moq oder Rhinomocks kann nur Scheininstanzen von Objekten erstellen. Dies bedeutet, dass das Verspotten statischer Methoden nicht möglich ist.
quelle
Wenn Sie den Code für Erweiterungsmethoden ändern können, können Sie ihn wie folgt codieren, um Folgendes testen zu können:
Die Erweiterungsmethoden sind also nur ein Wrapper um die Implementierungsschnittstelle.
(Sie können nur die Implementierungsklasse ohne Erweiterungsmethoden verwenden, die eine Art syntaktischen Zucker darstellen.)
Sie können die Implementierungsschnittstelle verspotten und als Implementierung für die Erweiterungsklasse festlegen.
quelle
Ich weiß, dass diese Frage seit ungefähr einem Jahr nicht mehr aktiv ist, aber Microsoft hat ein Framework veröffentlicht, das genau dies behandelt und Moles heißt .
Hier sind auch einige Tutorials:
quelle
Ich habe eine Wrapper-Klasse für die Erweiterungsmethoden erstellt, die ich verspotten musste.
Dann können Sie die Wrapper-Methoden in Ihren Tests verspotten und mit Ihrem IOC-Container codieren.
quelle
Für Erweiterungsmethoden verwende ich normalerweise den folgenden Ansatz:
Es erlaubt, _doSumm ziemlich einfach zu injizieren.
quelle
Das Beste, was Sie tun können, ist, eine benutzerdefinierte Implementierung für den Typ bereitzustellen, der über die Erweiterungsmethode verfügt, z.
quelle