为什么这个测试总是失败?
Why does this test keeps failing?
测试如下:
[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 测试框架
取消令牌不会中止任务。它仅设置您必须在任务中检查的标志 (CancellationToken.IsCancellationRequested)。但是,如果令牌在 Task
甚至开始之前被取消,则 Task
将不会 运行 并将跳到继续。
您希望 breached
在测试后成为 false
这一事实意味着您希望任务在 CancelAfter
指定的时间段后中止。
换句话说,您的 Thread.Sleep(200)
没有任何用途,尽管令牌 可能 在任务开始后约 10 毫秒被取消(您不应该期望非常精确的时间)。
测试如下:
[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 测试框架取消令牌不会中止任务。它仅设置您必须在任务中检查的标志 (CancellationToken.IsCancellationRequested)。但是,如果令牌在 Task
甚至开始之前被取消,则 Task
将不会 运行 并将跳到继续。
您希望 breached
在测试后成为 false
这一事实意味着您希望任务在 CancelAfter
指定的时间段后中止。
换句话说,您的 Thread.Sleep(200)
没有任何用途,尽管令牌 可能 在任务开始后约 10 毫秒被取消(您不应该期望非常精确的时间)。