我正在尝试创建一个最小的工作示例,说明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/

10-11 02:00
查看更多