加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:02:37 所属栏目:百科 来源:网络整理
导读:在等待引用等待的任务 T的行上的异步方法之后,我对我的断点感到惊讶.永远不会被击中: [Test] public async void GetSomethingTest() { var service = SimpleIoc.Default.GetInstanceIService(); var result = await service.TryGetSomethingAsync(20); Asse
在等待引用等待的任务< 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使用的方法如下所示:

[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而不是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继续,以便测试框架现在可以等待它,确保所有测试代码在考虑完成测试之前有时间运行.

(从技术上讲,一个框架也可以在异步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);
}

这将简单地阻止当前线程,直到TryGetSomethingAsync返回的Task完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读