Pergunta

Um dos maiores problemas que atualmente me impede de mergulhar a todo vapor nos testes de unidade é que uma grande porcentagem do código que escrevo depende fortemente de objetos COM de terceiros de diferentes fontes que também tendem a interagir entre si (eu ' Estou escrevendo suplementos para o Microsoft Office usando várias bibliotecas auxiliares, se você precisar saber).

Eu sei que provavelmente deveria usar objetos simulados, mas como exatamente eu faria isso neste caso?Posso ver que é relativamente fácil quando preciso apenas passar uma referência a um objeto já existente, mas algumas de minhas rotinas instanciam objetos COM externos e, às vezes, passam-nos para algum outro objeto COM externo de uma biblioteca diferente.

Qual é a abordagem de melhores práticas aqui?Devo fazer com que meu código de teste altere temporariamente as informações de registro COM no registro para que o código testado instancie um dos meus objetos simulados?Devo injetar unidades de biblioteca de tipos modificadas?Que outras abordagens existem?

Eu ficaria especialmente grato por exemplos ou ferramentas para Delphi, mas também ficaria feliz com conselhos mais gerais e explicações de nível superior.

Obrigado,

Oliver

Foi útil?

Solução

A abordagem tradicional diz que seu código cliente deve usar um wrapper, responsável por instanciar o objeto COM.Este wrapper pode então ser facilmente ridicularizado.

Como você tem partes do seu código instanciando diretamente os objetos COM, isso realmente não se encaixa.Se você puder alterar esse código, poderá usar o padrão de fábrica:eles usam a fábrica para criar o objeto COM.Você pode zombar da fábrica para devolver objetos alternativos.

Depende de você se o objeto é acessado por meio de um wrapper ou pela interface COM original.Se você optar por simular a interface COM, lembre-se de instrumentar IUnknown::QueryInterface em sua simulação, para saber que simulou todas as interfaces, principalmente se o objeto for passado para algum outro objeto COM.

Alternativamente, confira o CoTreateAsClass método.Nunca usei, mas pode fazer o que você precisa.

Outras dicas

Tudo se resume a 'projetar para testabilidade'.Idealmente, você não deve instanciar esses objetos COM diretamente, mas acessá-los por meio de uma camada indireta que pode ser substituída por um objeto simulado.

Agora, o próprio COM fornece um nível de indireção e você poderia fornecer um objeto simulado que fornecesse um substituto para o real, mas suspeito que seria difícil criar e duvido que você recebesse muita ajuda de uma estrutura simulada existente .

Eu escreveria uma classe wrapper fina em torno de seu objeto COM de terceiros, que tem a capacidade de carregar um objeto simulado em vez do objeto COM real na situação de teste de unidade.Normalmente faço isso tendo um segundo construtor que chamo de passagem do objeto simulado.O construtor normal teria apenas carregado o objeto COM normalmente.

O artigo da Wikipedia tem uma boa introdução ao assuntoWikipedia artível

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top