c# - Xunit 超时参数 : minimal working example

标签 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));

最佳答案

您可能打算使用 Assert.ThrowsAsync - 否则您正在测量开始任务需要多长时间(假设 50 意味着您打算设置一个超时 50 毫秒,你只是想证明它确实会失败)

虽然在某些情况下您可以避免它,但一般来说,我将这样的异步测试方法设为 async Task ... 并确保其中有一个 await那里可以更轻松地遵循流程(假设 Asyncness 是您测试的关键)

您可以在 https://github.com/xunit/xunit/issues/217 中找到讨论/示例有用


编辑:根据您的评论未经测试的示例

我正在尝试创建一个最小的工作示例,说明 Xunit.net 中的超时参数如何运行。我目前有以下 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)。我怀疑您不会有一种巧妙的方法来捕获所讨论的异常 - 如果您需要观察超时发生并对其使用react并做一些明确的事情(理想情况下您希望避免在测试中这样做),您将需要通过执行 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 超时参数 : minimal working example,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690236/

相关文章:

asp.net-core - 如何在 xunit 中运行稍微不同版本的测试类

c# - 动态添加的 ASP.NET 控件在后面的代码中不可见

c# - 字符串数组搜索

javascript - 刷新/定时器功能仅适用于 2 个提要中的 1 个 -- $q.all() 合并

node.js - Cassandra 操作超时

.net - 为什么 .NET Core (dnxcore50) xUnit 测试在 VS2015 测试资源管理器中不可见?

c# - 在 'object' 上找不到 WPF/XAML 属性

c# - 将旧的 VB6 QBColor 函数翻译成 C#

javascript - 如何清除angularjs中的$timeout

c# - Xunit 的 App.config