Warten auf Ereignisauslösung in Silverlight-Unit-Tests

Ich verwende das Silverlight Unit Testing Framework, um einige View Manager-Klassen zu testen. Einige Tests erfordern diePropertyChanged auszulösende Ereignisse.

Ich verwende derzeit eine Kombination ausEnqueueConditional undWaitHandles

Beispiel 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();
}

Das funktioniert. Aber ich habe Fragen, die mich quälen:

Muss ich tatsächlich einen WaitHandle verwenden? Würde es genauso gut funktionieren, wenn ich nur einen Bool benutzen würde?

Beispiel 2

bool fHasFiredEvent = false;
manager.PropertyChanged += (sender, propChangeArgs) =>
                           { 
                               fHasFiredEvent = true;
                           }
manager.DoTheThingThatTriggersNotification();    
EnqueueConditional (() => fHasFiredEvent);
EnqueueTestComplete();

Oder wäre es besser, wenn ich den WaitHandle behalten würde, aber das TimeoutAttribute verloren hätte und die Wartezeit abgelaufen wäre?

Beispiel 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();
}

Jetzt habe ich drei Beispiele geschrieben, und alle funktionieren. Also ist meine letzte Frage

Welches hätte die beste Leistung? (Auch wenn der Unterschied vernachlässigbar und rein akademisch ist. Es ist um seiner selbst willen interessant.)Hat eines der drei Beispiele grundlegende Mängel?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage