Xunit Timeout参数:最小的工作示例

时间:2018-08-04 23:15:04

标签: c# timeout xunit.net

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

1 个答案:

答案 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管理超时而不用这种逻辑污染测试的前一种方法是您在这里想到达。