Web API Moq异步EF6单元测试

时间:2014-02-19 13:28:21

标签: entity-framework moq async-await entity-framework-6

我正在使用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>();
    }
}

任何想法我做错了什么?

0 个答案:

没有答案