Testowanie jednostki asynchronicznej Silverlight
Mam dziwny problem z Silverlight Unit Test Framework. Pierwsza wykonana metoda zawodzi za każdym razem. Mam drugi test z dokładnie tym samym kodem i przechodzi. Dziwną rzeczą przy pierwszym wywołaniu jest fakt, że faktycznie czeka na limit czasui wtedy wykonuje wywołanie repozytorium (pod nim znajduje się HTTP PUT, jeśli ci zależy). Oto kod - pierwszy z nich kończy się niepowodzeniem za każdym razem, drugi przechodzi za każdym razem:
[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.");
}
}
Edytować: Moje ostateczne rozwiązanie to modyfikacja rozwiązania Vladmira:
[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();
}