Jak pozorować SoapException za pomocą Moq do obsługi błędów testu jednostkowego

Odziedziczyłem małą aplikację konsoli, która wywołuje usługę sieciową SOAP. Jest to tragiczny bałagan zagnieżdżonych prób, które rejestrują wyjątki na różne sposoby, i chciałbym zawinąć trochę pokrycia testowego wokół tego, jak zachowuje się, gdy zostanie zgłoszony wyjątek SoapException.

Pytanie: W jaki sposób mogę wykorzenić klasę, taką jak SoapException, używając Moq, gdy nie mogę wyszydzić interfejsu i nie mogę tworzyć właściwości lub metod „wirtualnych”?

Trochę więcej wyjaśnień:

Aby przetestować tę obsługę błędów, muszę kontrolowaćActor właściwość obiektu SoapException, a takżeDetail właściwość w celu weryfikacji obsługi błędów.

Fragment kodu testu mojej jednostki:

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

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

Ponieważ kpię z konkretnej klasy iActor właściwość nie jest oznaczona jako „wirtualna”, Moq rzuca ten wyjątek podczas wykonywaniaSetupGet(...) linia podczas testu:

System.NotSupportedException: Nieprawidłowa konfiguracja na nie-wirtualnym (nadpisywalnym w VB) elemencie: ex => ex.Actor

Po pewnym przeczytaniu idealną odpowiedzią jest wyszydzenie interfejsu, którego nie mogę w tym przypadku zrobić. Ponieważ jest to klasa upieczona w ramach .NET, nie mogę też magicznie oznaczyćActor właściwość jako wirtualna.

Jak mogę wykpić wyjątek SoapException lub czy istnieje inny sposób sprawdzenia obsługi błędów?

Na marginesie, najpierw zatopiłem się w tworzeniu rzeczywistego wyjątku SoapException z kilkoma węzłami XML wewnątrz niego, ale szybko spadłem do dziury królika programowego tworzenia drzewa dokumentu XML. jamogą Zrób to, ale wymagałoby to znacznie więcej linii kodu konfiguracji testu, których chciałbym uniknąć, jeśli to możliwe.

questionAnswers(2)

yourAnswerToTheQuestion