我正在使用Moq为EF6 Async方法制作Mocks。但有些东西不正常,因为我得到以下异常:
源IQueryable未实现IDbAsyncEnumerable {0}。只要 实现IDbAsyncEnumerable的源可用于实体 框架异步操作。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=287068
我有以下代码: 的UnitTest1.cs
var mockSet = new Mock<DbSet<MyModel>>();
mockSet.As<IDbAsyncEnumerable<MyModel>>()
.Setup(m => m.GetAsyncEnumerator())
.Returns(new TestDbAsyncEnumerator<MyModel>(data.GetEnumerator()));
mockSet.As<IQueryable<MyModel>>()
.Setup(m => m.Provider)
.Returns(new TestDbAsyncQueryProvider<MyModel>(data.Provider));
mockSet.As<IQueryable<MyModel>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<MyModel>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<MyModel>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<PDBContext>();
mockContext.Setup(c => c.GetSet<MyModel>()).Returns(mockSet.Object);
//Test!
var controller = new MyModelController();
controller.MyModelStore = new MyModelStore(mockContext.Object);
var result = await controller.GetBestOppertunity(2) as OkNegotiatedContentResult<List<MyModel>>;
//Result
Assert.IsNotNull(result);
Assert.AreEqual(2, result.Content.Count);
MyModelStore.cs
public async Task<List<MyModel>> GetBestOppertunity(int limit)
{
return await Context.GetSet<MyModel>().OrderByDescending(x => x.StartDate).Take(limit).ToListAsync();
}
我将代码基于以下博客,以防止错误发生:http://msdn.microsoft.com/en-us/data/dn314429
但确切地说,我正试图阻止错误。此处解释了错误:http://msdn.microsoft.com/en-US/data/dn313107
错误发生在代码中:MyModelStore.cs中的GetBestOppertunity(int limit)。
GetSet方法显示只有一个包装器才能将单元测试附加到Set方法。
PDBContext.cs(DatabaseFirst)
public partial class PDBContext : IPDBContext
{
public virtual IDbSet<T> GetSet<T>() where T : class
{
return Set<T>();
}
}
任何想法我做错了什么?