Aguardando o acionamento de eventos nos testes da unidade do Silverlight
Estou usando o Silverlight Unit Testing Framework para testar algumas classes do View Manager. Alguns testes exigemPropertyChanged eventos a serem disparados.
Atualmente estou usando uma combinação deEnqueueConditional eWaitHandles
Exemplo 1
[TestMethod]
[Asynchronous]
[Timeout(1000)]
public void TestNotificationExample()
{
var manager = new UserManager();
var waitHandle = new ManualResetEvent(false);
manager.PropertyChanged += (sender, propChangArgs) =>
{
waitHandler.Set();
};
manager.DoTheThingThatTriggersNotification();
// The notification event fires aynshronously to this
EnqueueConditional (() => waitHandler.WaitOne(0));
// Enqueue other tests here....
EnqueueTestComplete();
}
Isso funciona. Mas eu tenho perguntas me importunando:
Eu realmente preciso usar um WaitHandle? Funcionaria igualmente bem se eu usasse apenas um bool?
Exemplo 2
bool fHasFiredEvent = false;
manager.PropertyChanged += (sender, propChangeArgs) =>
{
fHasFiredEvent = true;
}
manager.DoTheThingThatTriggersNotification();
EnqueueConditional (() => fHasFiredEvent);
EnqueueTestComplete();
Ou seria melhor se eu mantivesse o WaitHandle, mas perdesse o TimeoutAttribute e o tempo esgotado no Wait?
Exemplo 3
[TestMethod]
[Asynchronous]
public void TestNotificationExample()
{
var manager = new UserManager();
var waitHandle = new ManualResetEvent(false);
manager.PropertyChanged += (sender, propChangArgs) =>
{
waitHandler.Set();
};
manager.DoTheThingThatTriggersNotification();
EnqueueCallback (() => Assert.IsTrue(waitHandler.WaitOne(1000));
EnqueueTestComplete();
}
Então agora eu escrevi três exemplos e todos eles funcionam. Então minha última pergunta é
Qual teria o melhor desempenho? (Mesmo que a diferença seja insignificante e seja puramente acadêmica, yada yada yada. É interessante por si só.)Algum dos três exemplos tem falhas fundamentais?