c# – 单元测试FindAsync

我已经使用这篇优秀的MSDN文章中找到的异步查询提供程序设置了一个测试项目: http://msdn.microsoft.com/en-US/data/dn314429#async非常有用.

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

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

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

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

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

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

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

    var mockContext = new Mock<BloggingContext>();
    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时,等待_context.Blogs.FindAsync(blogId);抛出NullReferenceException
在TestingDemo.BlogService.< GetBlog> d__5.MoveNext()

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

解决方法

用于异步方法的MoveNext内部的NullReferenceException几乎总是由于从另一个异步方法返回null.

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

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么