代码之家  ›  专栏  ›  技术社区  ›  Andrew Shepherd

正在Silverlight单元测试中等待事件触发

  •  4
  • Andrew Shepherd  · 技术社区  · 15 年前

    我正在使用Silverlight单元测试框架测试一些视图管理器类。有些测试需要 财产变更 要激发的事件。

    我目前正在使用 侍者把手

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

    现在我写了三个例子,它们都很有效。所以我的最后一个问题是

    • 哪一个最好 差别是可以忽略的,而且是可以忽略的 纯学术的雅达雅达雅达。这本身就很有趣。)
    • 根本缺陷?
    1 回复  |  直到 15 年前
        1
  •  5
  •   Ken Smith    15 年前

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

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

    也就是说,如果有人想四处打探,给出更权威的答案,我洗耳恭听:-)。