【发布时间】:2010-12-26 16:41:48
【问题描述】:
我正在使用 Silverlight 单元测试框架来测试一些视图管理器类。某些测试需要触发 PropertyChanged 事件。
我目前正在使用 EnqueueConditional 和 WaitHandles
的组合示例 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();
}
这行得通。但我有一些问题困扰着我:
我真的需要使用 WaitHandle 吗?如果我只使用布尔值,它的性能是否也一样好?
示例 2
bool fHasFiredEvent = false;
manager.PropertyChanged += (sender, propChangeArgs) =>
{
fHasFiredEvent = true;
}
manager.DoTheThingThatTriggersNotification();
EnqueueConditional (() => fHasFiredEvent);
EnqueueTestComplete();
或者如果我保留 WaitHandle,但丢失了 TimeoutAttribute 并在 Wait 上超时会更好?
示例 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();
}
所以现在我写了三个例子,它们都有效。所以我的最后一个问题是
- 哪个最好 表现? (尽管 差异可以忽略不计,它是 纯学术呀呀呀呀呀。它本身就很有趣。)
- 这三个示例中的任何一个是否具有 根本缺陷?
【问题讨论】:
-
我要添加一个基本缺陷,即单元测试不应该这么复杂:-)
标签: .net silverlight multithreading unit-testing