gpt4 book ai didi

c# - 如何在单元测试中等待后使用断点?

转载 作者:太空狗 更新时间:2023-10-29 18:20:04 24 4
gpt4 key购买 nike

我很惊讶我在 await 之后的断点ing async引用等待的行上的方法 Task<T>永远不会被击中:

    [Test]
public async void GetSomethingTest()
{
var service = SimpleIoc.Default.GetInstance<IService>();
var result = await service.TryGetSomethingAsync(20);
Assert.IsTrue(result.IsSuccess);
Assert.IsNotNull(result.ReturnValue);
}

在第一个 Assert 处设置断点线永远不会被击中,但测试通过。

等待返回时如何中断?

更新:我猜是因为测试框架不是await在测试方法的调用中,我使用的是 NUnit 2.6.3 并声称 async支持,但是这是否需要在 await 之后中断就像我正在尝试做的那样,我不确定...

最佳答案

问题是你的方法是async void .这具有即发即弃的语义。

从概念上讲,您的方法对 async 做了什么- await用法如下所示:

[Test]
public void GetSomethingTest()
{
var service = SimpleIoc.Default.GetInstance<IService>();
service.TryGetSomethingAsync(20).ContinueWith(t =>
{
var result = t.Result;
Assert.IsTrue(result.IsSuccess);
Assert.IsNotNull(result.ReturnValue);
});
}

现在应该很清楚问题出在哪里了。您的测试方法会在 TryGetSomethingAsync 后立即返回返回其 Task .所以测试立即结束。由于没有抛出任何异常,因此它是成功的。

如果你的测试框架支持Task -返回测试,您可以通过简单地将其返回类型更改为 Task 来修复您的测试以执行您想要的操作而不是 void .

[Test]
public async Task GetSomethingTest()
{
var service = SimpleIoc.Default.GetInstance<IService>();
var result = await service.TryGetSomethingAsync(20);
Assert.IsTrue(result.IsSuccess);
Assert.IsNotNull(result.ReturnValue);
}

这将在概念上转化为以下内容。

[Test]
public Task GetSomethingTest()
{
var service = SimpleIoc.Default.GetInstance<IService>();
return service.TryGetSomethingAsync(20).ContinueWith(t =>
{
var result = t.Result;
Assert.IsTrue(result.IsSuccess);
Assert.IsNotNull(result.ReturnValue);
});
}

注意 Task continuation 被返回,这样测试框架现在可以等待它,确保所有测试代码在测试被认为完成之前有时间运行。

(从技术上讲,一个框架也可以在 async void 案例中工作,但我不知道为什么这会是一个很好的功能,所以我预计大多数人不会处理它。)

如果您的测试框架不支持任务返回测试,您可以使用 .Result 修复您的测试而不是 await .

[Test]
public void GetSomethingTest()
{
var service = SimpleIoc.Default.GetInstance<IService>();
var result = service.TryGetSomethingAsync(20).Result;
Assert.IsTrue(result.IsSuccess);
Assert.IsNotNull(result.ReturnValue);
}

这将简单地阻塞当前线程直到Task。由 TryGetSomethingAsync 返回完成了。

关于c# - 如何在单元测试中等待后使用断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24817370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com