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.

Kevin moore
fonte
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.

Wim Coenen
fonte
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.

Richard Banks
fonte
3
Não vejo isso como uma resposta à pergunta
SteveC