Como simular SoapException usando Moq para tratamento de erros de teste de unidade
Eu herdei um pequeno aplicativo de console que faz chamadas para um serviço web SOAP. É uma bagunça trágica de tentativas aninhadas de registrar exceções de várias maneiras, e eu gostaria de incluir uma cobertura de teste sobre como ela se comporta quando uma SoapException é lançada.
Pergunta: Como posso zombar de uma classe como SoapException usando Moq quando não posso zombar de uma interface e não posso tornar propriedades ou métodos "virtuais"?
Um pouco mais de explicação:
Para testar esse tratamento de erros, preciso controlar oActor
propriedade do objeto SoapException, bem como oDetail
propriedade para verificar o tratamento de erros.
Um trecho do meu código de teste de unidade:
[TestMethod]
public void MyTestMethod()
{
Mock<SoapException> soapMock = new Mock<SoapException>(MockBehavior.Strict);
soapMock.SetupGet<string>(ex => ex.Actor).Returns("Test Actor");
Desde que eu estou zombando de uma classe concreta, e oActor
propriedade não está marcada como "Virtual", o Moq lança essa exceção ao executar oSetupGet(...)
linha durante a execução do teste:
System.NotSupportedException: instalação inválida em um membro não virtual (substituível no VB): ex => ex.Actor
Após algumas leituras, a resposta ideal é zombar de uma interface, o que não posso fazer neste caso. Como essa é uma classe incorporada ao .NET framework, também não posso marcar magicamente oActor
propriedade como virtual.
Como posso zombar de uma SoapException, ou existe uma maneira diferente de verificar o tratamento de erros?
Como um aparte, eu comecei a criar uma SoapException real com alguns nós XML, mas rapidamente caí no buraco de criar programaticamente uma árvore de documentos XML. Eupode fazê-lo, mas exigiria muito mais linhas de código de configuração de teste, que eu gostaria de evitar, se possível.