Xuit Timeout参数:最小工作示例



我试图创建一个关于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,以使其更容易遵循流程(假设Asyncness是测试的关键(

您可以在中找到讨论/示例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管理超时,而不会用这种逻辑污染测试,这就是你想要达到的目的

相关内容

  • 没有找到相关文章

最新更新