单元测试FindAsync

 小哥 发布于 2023-02-12 19:36

我使用这篇优秀的MSDN文章中的异步查询提供程序设置了一个测试项目:http://msdn.microsoft.com/en-US/data/dn314429#async,效果很好.

但是当我添加一个调用的方法时FindAsync:

public async Task GetBlog(int blogId)
{
    return await _context.Blogs.FindAsync(blogId);
}

并以以下格式添加以下单元测试:

[TestMethod]
public async Task GetAllBlogsAsync_gets_blog()
{
    var data = new List
    {
        new Blog { BlogId = 1, Name = "BBB" },
        new Blog { BlogId = 2, Name = "ZZZ" },
        new Blog { BlogId = 3, Name = "AAA" },
    }.AsQueryable();

    var mockSet = new Mock>();
    mockSet.As>()
        .Setup(m => m.GetAsyncEnumerator())
        .Returns(new TestDbAsyncEnumerator(data.GetEnumerator()));

    mockSet.As>()
        .Setup(m => m.Provider)
        .Returns(new TestDbAsyncQueryProvider(data.Provider));

    mockSet.As>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As>().Setup(m => m.ElementType).Returns(data.ElementType);
    mockSet.As>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

    var mockContext = new Mock();
    mockContext.Setup(c => c.Blogs).Returns(mockSet.Object);

    var service = new BlogService(mockContext.Object);
    var blog = await service.GetBlog(2);

    Assert.AreEqual("ZZZ", blog.Name);
}

但是当GetBlog从我的测试方法调用时,await _context.Blogs.FindAsync(blogId);抛出一个NullReferenceException atTestingDemo.BlogService.d__5.MoveNext()

有关如何FindAsync使用MSDN文章中的测试方法调用方法的单元测试的任何建议:http://msdn.microsoft.com/en-US/data/dn314429#async?

1 个回答
  • NullReferenceException内的MoveNext一个async方法是几乎总是由于返回null从另一个异步方法.

    在这种情况下,它看起来像是FindAsync返回null,这是有道理的,因为我没有看到你在嘲笑它.你现在正在嘲笑IQueryableGetAsyncEnumerator方面,但不是FindAsync.您发布的示例文章未提供完整的DbSet模拟解决方案.

    2023-02-12 19:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有