gpt4 book ai didi

.net - 在 Silverlight 单元测试中等待事件触发

转载 作者:行者123 更新时间:2023-12-01 00:04:56 25 4
gpt4 key购买 nike

我正在使用 Silverlight 单元测试框架来测试一些 View 管理器类。某些测试需要触发 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 吗?如果我只使用 bool 值,它的性能是否一样好?

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

或者,如果我保留 WaitHandle,但丢失了 TimeoutAttribute 并在等待时超时会更好吗?

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

所以现在我写了三个例子,它们都有效。所以我的最后一个问题是
  • 哪个最好
    表现? (尽管
    差异可以忽略不计
    纯粹的学术雅达雅达雅达。这本身就很有趣。)
  • 三个例子中的任何一个是否有
    根本缺陷?
  • 最佳答案

    如果没有在三个示例中实际运行实际代码,我不知道我可以给出权威答案,但我的建议是使用 #2,并避开 #1 和 #3。

    我已经翻阅了 Jeff Wilcox 的 Silverlight 单元测试框架的源代码,我记得,他对 EnqueueConditional 使用了一个聪明但非常可怕的 hack,即,他反复调用在计时器/背景上传递给 EnqueueConditional() 的谓词线程,每次检查它是否返回true。 (这不是您在生产代码中想要的,但对于测试框架来说,逻辑已经足够了,我想。)

    因此,如果您的测试需要几秒钟才能完成,我希望您的 waitHandler.WaitOne() 要么 (a) 被多次调用,从而阻塞每个线程;或 (b) 阻塞一个线程,该线程可能也正在做其他事情。我想 a (c) 也是可能的,也就是说,你可能会很幸运,WaitOne() 不会阻止任何重要的事情,并且只会被调用一次。但当然#2 是使用这个测试框架的“标准”方式,除非你有特定的理由来引入更复杂的 WaitHandle 逻辑,否则我不会试图将测试框架推向那个方向。

    也就是说,如果有人想四处看看并提供更权威的答案,我会全神贯注:-)。

    关于.net - 在 Silverlight 单元测试中等待事件触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1905353/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com