我试图创建一个关于Xuit.net中Timeout
参数如何操作的最小工作示例。我目前有以下Fact
示例,但它并没有像我预期的那样运行,因为它没有通过测试:
[Fact(Timeout = 50)]
public void FactTimeout_TimeoutLessThanProcessingTime_ThrowTestTimeoutException()
{
// Arrange
// Act
Action act = () => Task.Delay(5000);
// Assert
Assert.Throws<TestTimeoutException>(act);
}
这是正确的,还是我的理解是错误的?是否还有其他内容需要更改或添加到测试本身或Xuit配置中?
更新
根据@RubenBartelink的回答,我得到了以下内容:
// Will generate the exception and display it in the results window
[Fact(Timeout = 50)]
public async void TestOne() => await Task.Delay(5000);
// This will pass the test, but will complain that it is not awaited
[Fact(Timeout = 50)]
public void TestTwo() => Assert.ThrowsAsync<TestTimeoutException>(() => Task.Delay(5000));
您可能打算使用Assert.ThrowsAsync
,否则您将测量启动任务所需的时间(假设50表示您打算设置50ms的超时,并且您只想证明它确实会失败(
虽然在某些情况下你可以避免它,但一般来说,我将这种异步测试方法设为async Task ...
,并确保其中有一个await
,以使其更容易遵循流程(假设Async
ness是测试的关键(
您可以在中找到讨论/示例https://github.com/xunit/xunit/issues/217有用
EDIT:根据您的评论的未测试impl示例
我试图创建一个关于Xuit.net中Timeout参数如何操作的最小工作示例。我目前有以下事实示例,但它并没有像我预期的那样运行,因为它没有通过测试:
[Fact(Timeout = 50)]
public async Task FactTimeout_TimeoutLessThanProcessingTime_ThrowTestTimeoutException()
{
Action act = () => Task.Delay(5000);
// Trigger the timeout by attempting something that will take too long
await act;
}
这应该会在内部导致测试超时(您试图捕获的TestTimeoutException
(。我怀疑没有一种巧妙的方法可以让你捕捉到有问题的异常——如果你需要观察并对发生的超时做出反应,并做一些明确的事情(理想情况下,你希望在测试中避免这样做(,你需要通过做一个大致如下的Task.WhenAny
来明确地管理它:
public async Task FactTimeout_TimeoutLessThanProcessingTime_ThrowTestTimeoutException()
{
Action act = () => Task.Delay(5000);
let timeoutTask = Task.Delay(50);
let res = await Task.WhenAny(timeoutTask, act);
Assert.IsSame(timeoutTask, res);
}
注意,这只是一个例子,表明超时确实发生了,并且可以观察到-前一种方法是正确的awaiting
,让xUnit管理超时,而不会用这种逻辑污染测试,这就是你想要达到的目的