So verspotten Sie SoapException mithilfe von Moq bei der Behandlung von Unit-Test-Fehlern

Ich habe eine kleine Konsolenanwendung geerbt, die einen SOAP-Webdienst aufruft. Es ist ein tragisches Durcheinander verschachtelter Try-Catches, die Ausnahmen auf verschiedene Weise protokollieren, und ich möchte einige Testberichte darüber schreiben, wie es sich verhält, wenn eine SoapException ausgelöst wird.

Frage: Wie kann ich eine Klasse wie SoapException mit Moq verspotten, wenn ich keine Schnittstelle verspotten kann und Eigenschaften oder Methoden nicht "virtuell" machen kann?

Ein bisschen mehr Erklärung:

Um diese Fehlerbehandlung zu testen, muss ich das kontrollierenActor Eigenschaft des SoapException-Objekts sowie desDetail Eigenschaft, um die Fehlerbehandlung zu überprüfen.

Ein Ausschnitt aus meinem Unit-Test-Code:

[TestMethod]
public void MyTestMethod()
{
    Mock<SoapException> soapMock = new Mock<SoapException>(MockBehavior.Strict);

    soapMock.SetupGet<string>(ex => ex.Actor).Returns("Test Actor");

Da ich mich über eine konkrete Klasse lustig mache und dieActor Die Eigenschaft ist nicht als "Virtuell" markiert. Moq löst diese Ausnahme aus, wenn das Programm ausgeführt wirdSetupGet(...) Linie während des Testlaufs:

System.NotSupportedException: Ungültiges Setup für ein nicht virtuelles (in VB überschreibbares) Mitglied: ex => ex.Actor

Nach einigem Lesen ist die ideale Antwort, eine Schnittstelle zu verspotten, was ich in diesem Fall nicht kann. Da dies eine Klasse ist, die in das .NET Framework eingebunden ist, kann ich das auch nicht magisch markierenActor Eigenschaft als virtuell.

Wie kann ich eine SoapException verspotten oder kann ich die Fehlerbehandlung auf andere Weise überprüfen?

Im Übrigen habe ich zunächst eine tatsächliche SoapException mit einigen darin enthaltenen XML-Knoten erstellt, bin jedoch schnell auf die Idee gekommen, programmgesteuert einen XML-Dokumentbaum zu erstellen. ichkann tun Sie es, aber es würde viel mehr Zeilen Test-Setup-Code erfordern, den ich nach Möglichkeit vermeiden möchte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage