我正在尝试创建一个最小的工作示例,说明Xunit.net中的Timeout
参数如何运行。我目前有以下Fact
示例,但由于无法通过测试,因此无法正常运行:
[Fact(Timeout = 50)]
public void FactTimeout_TimeoutLessThanProcessingTime_ThrowTestTimeoutException()
{
// Arrange
// Act
Action act = () => Task.Delay(5000);
// Assert
Assert.Throws<TestTimeoutException>(act);
}
这是正确的,还是我的理解是错误的?还有其他需要更改或添加到测试本身或Xunit配置的内容吗?
更新资料
基于@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中找到有用的讨论/示例
编辑:根据您的评论示例未经测试的隐含
我正在尝试创建一个最小的工作示例,说明Xunit.net中的Timeout参数如何运行。我目前有以下Fact示例,但由于无法通过测试,因此无法正常运行:
[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管理超时而不用这种逻辑污染测试的前一种方法。关于c# - Xunit Timeout参数:最小的工作示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51690236/