Teste de unidade assíncrona do Silverlight
Estou tendo um problema estranho com o Silverlight Unit Test Framework. O primeiro método executado falha toda vez. Eu tenho um segundo teste com o mesmo código exato e ele passa. O estranho da primeira vez que é chamado é que ele realmente aguarda o tempo limitee depois executa a chamada do repositório (por baixo é um HTTP PUT se você se importa). Aqui está o código - o primeiro falha toda vez, o segundo passa toda vez:
[TestMethod]
public void AuthShouldSucceed()
{
var autoResetEvent = new AutoResetEvent(false);
_authRepository.Authenticate(_username, _password, response =>
{
Assert.IsTrue(response);
autoResetEvent.Set();
});
if (!autoResetEvent.WaitOne(Constants.Timeout))
{
Assert.Fail("Test timed out.");
}
}
[TestMethod]
public void AuthShouldSucceed2()
{
var autoResetEvent = new AutoResetEvent(false);
_authRepository.Authenticate(_username, _password, response =>
{
Assert.IsTrue(response);
autoResetEvent.Set();
});
if (!autoResetEvent.WaitOne(Constants.Timeout))
{
Assert.Fail("Test timed out.");
}
}
Editar: Minha solução final é uma modificação da solução de Vladmir:
[TestMethod]
[Asynchronous]
public void AuthShouldSucceed()
{
var complete = false;
var result = false;
_authRepository.Authenticate(_username, _password, response =>
{
complete = true;
result = response;
});
EnqueueConditional(() => complete);
EnqueueCallback(() => Assert.IsTrue(result));
EnqueueTestComplete();
}