Oczekiwanie na wyzwolenie zdarzenia w testach jednostkowych Silverlight
Używam Silverlight Unit Testing Framework do testowania niektórych klas View Manager. Niektóre testy wymagająPropertyChanged wydarzenia do wystrzelenia.
Obecnie używam kombinacjiEnqueueConditional iWaitHandles
Przykład 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();
}
To działa. Ale mam pytania, które mnie dręczą:
Czy rzeczywiście muszę korzystać z WaitHandle? Czy sprawdzi się równie dobrze, jeśli użyję bool?
Przykład 2
bool fHasFiredEvent = false;
manager.PropertyChanged += (sender, propChangeArgs) =>
{
fHasFiredEvent = true;
}
manager.DoTheThingThatTriggersNotification();
EnqueueConditional (() => fHasFiredEvent);
EnqueueTestComplete();
Czy może byłoby lepiej, gdybym zachował WaitHandle, ale stracił atrybut TimeoutAttribute i przekroczył limit czasu oczekiwania?
Przykład 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();
}
Więc teraz napisałem trzy przykłady i wszystkie działają. Moje ostatnie pytanie brzmi
Który miałby najlepszą wydajność? (Nawet jeśli różnica jest znikoma i jest to czysto akademicka yada yada yada. Jest interesująca sama z siebie.)Czy którykolwiek z tych trzech przykładów ma podstawowe wady?