我正在尝试创建一个最小的工作示例,以说明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));
答案 0 :(得分:1)
您可能打算使用Assert.ThrowsAsync
-否则,您正在衡量启动任务所需的时间(假设50表示您打算将超时设置为50ms,而您只是想证明它确实会失败)
尽管在某些情况下您可以避免使用它,但总的来说,我将这样的异步测试方法设为async Task ...
,并确保其中有await
以便于遵循流程(假设Async
的状态是测试的关键)
您可能会在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管理超时而不用这种逻辑污染测试的前一种方法是您在这里想到达。