我使用这篇优秀的MSDN文章中的异步查询提供程序设置了一个测试项目:http://msdn.microsoft.com/en-US/data/dn314429#async,效果很好.
但是当我添加一个调用的方法时FindAsync
:
public async TaskGetBlog(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.
有关如何FindAsync
使用MSDN文章中的测试方法调用方法的单元测试的任何建议:http://msdn.microsoft.com/en-US/data/dn314429#async?
NullReferenceException
内的MoveNext
一个async
方法是几乎总是由于返回null
从另一个异步方法.
在这种情况下,它看起来像是FindAsync
返回null
,这是有道理的,因为我没有看到你在嘲笑它.你现在正在嘲笑IQueryable
和GetAsyncEnumerator
方面,但不是FindAsync
.您发布的示例文章未提供完整的DbSet
模拟解决方案.