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?