Unit Test – Resolvendo erro ao executar vários testes ao mesmo tempo

Um dia desses, ao realizar alguns testes, percebi que rodando um determinado teste de forma isolada eu não tinha problemas. Porém ao executar todos ao mesmo tempo, o teste quebrava (independentemente de clean em banco). 

image

A mensagem de erro obtida:

COM object that has been separated from its underlying RCW cannot be used

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.”

A mensagem de erro é bem antiga. Mas para testes, era algo que não tinha visto.
Analisando, vi que o método de teste acessava um componente COM através de uma chamada implícita de anotação. Desta forma teremos dois processos (nativo e COM) ao rodar todos os testes. Dessa forma, como não é possível disparar dois processos em uma mesma thread, obtemos o erro citado acima.

Podemos resolver este problema apenas realizando uma pequena configuração ao seu arquivo de testes (xml).

image

Abra o Local.testsettings em um XML (Text) Editor e modifique o parâmetro apartmentState=”STA” para “MTA” como na instrução abaixo:

<testsettings  xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010" name="Local">
<description>These are default test settings for a local test run.</description>
<execution>
<executionthread  apartmentstate="MTA"></executionthread>
</execution>
</testsettings>

Da forma tradicional o método testado não é compatível com STA (Single Threaded Apartment), então, tive que alterar e executar meus testes em modo MTA (Multithreaded Apartment).

Salve, feche e abra o VS e execute todos seus testes novamente.

image

Pronto, agora tudo verde. Só alegria!

Você pode saber mais sobre Single Threaded e Multithreaded na documentação da Microsoft.

[]’s