Como se testa o código assíncrono usando MSTest


92

Estou escrevendo um código assíncrono super simples. Basta salvar um arquivo fora do thread.

Eu gostaria de testar este código usando a estrutura de teste de unidade MSTest no Microsoft Visual Studio Team System 2008.

Como eu faço isso?

Eu gostaria de bloquear simplesmente o método de teste até que o método retorne. Posso imaginar algumas maneiras de fazer isso, mas estou impressionado com a inexistência de práticas recomendadas ou classes auxiliares para isso.

Vejo muito para o Silverlight, mas nada genérico.


4
Duplicado? stackoverflow.com/questions/1174702/… (Acho que as respostas fornecidas não estão diretamente relacionadas a qual estrutura de teste é usada)
Fredrik Mörk

1
sim, é - e a resposta será a mesma, eu acho.
Andras Zoltan

Respostas:


167

O Visual Studio 2012 (anteriormente conhecido como "Visual Studio 11") introduziu suporte para testes assíncronos . Se parece com isso:

[TestMethod]
public async Task FooTest()
{
   var result = await SomeAsyncOperation();
   Assert.IsTrue(someCondition);
}

Conforme observado nos comentários, o Tasktipo de retorno é importante . Não funcionará se você declarar o método como retornando void.


59
Observe que o Tasktipo de retorno é obrigatório - voidnão funcionará (pelo menos não na atualização 4 do VS2013)
Ohad Schneider

3
(Isso nunca funcionará, pois void-retornar métodos assíncronos não pode ser esperado)
Richard Szalay

1
@RichardSzalay: pode funcionar, veja aqui como o NUnit faz: stackoverflow.com/questions/15031681/…
Wim Coenen

-3

Em vez de chamar os métodos System.IO diretamente, tente usar a biblioteca SystemWrapper . Então, em seus testes, você pode simular as chamadas como desejar, retornar o que quiser de volta ao seu teste, incluindo condições de erro, e verificar se sua lógica funciona conforme o esperado.

Se você quiser ver um exemplo, dê uma olhada nesta postagem do blog que mostra como ele pode ser usado com RhinoMocks.


3
Não vejo isso como uma resposta à pergunta
SteveC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.