为什么这个测试会失败?

时间:2016-07-23 19:54:45

标签: c# unit-testing task-parallel-library cancellationtokensource

测试如下:

[TestMethod()]
public void IncrementTestNegative() {

    CancellationTokenSource s = new CancellationTokenSource();
    s.CancelAfter(10);

    ManualResetEventSlim evt = new ManualResetEventSlim();

    bool breached = false;
    Task.Run(() => {
        Thread.Sleep(200);
        breached = true;
    }, s.Token).ContinueWith((t) => {
        evt.Set();
    });


    evt.Wait();
    Assert.IsFalse(breached);
}

如果我向CancelAfter提供值“0”,则测试用例成功。为什么这个测试会与其他值一起失败。

这是在Visual Studio Express中使用MS Test框架

1 个答案:

答案 0 :(得分:2)

取消令牌不会中止该任务。它只设置您必须在任务内部检查的标志(CancellationToken.IsCancellationRequested)。但是,如果在Task偶数开始之前取消令牌,则Task将不会运行并将跳转到续行。

在测试之后,您希望breachedfalse意味着您希望在CancelAfter指定的时间段之后中止任务。

换句话说,你的Thread.Sleep(200)没有目的,虽然令牌可能在任务开始后约10ms被取消(你不应该期望非常精确)定时)。