1

我在运行测试时收到此错误:System.NotImplementedException:成员 'IQueryable.Provider' 尚未在类型 'DbSet' 上实现......' 我看到了这篇关于创建 fakeDbSet 的博客文章,但那是在 EF6 之前。EF 6 有没有更好的方法来处理这个问题?

[Test]
public void Edit_ShouldCall_DbContext_Entry()
{
        //arrange
    var request = Builder<EditGroupRequest>.CreateNew().Build();
    fakeDbSet.Stub(x => x.FirstOrDefault(y => y.ReportGroupNameKey == request.Key)).Return(new MyObject());

    //act
    _sut.Edit(request);

    //assert
    _contextFake.AssertWasCalled(x => x.Entry(Arg<MyObject>.Is.Anything).Property(y => y.ReportGroupName).CurrentValue = request.Name);
}
4

1 回答 1

0

虽然 DBSet 实现了 IQueryable、IDbSet……mock 引擎生成的对象并没有实现它们。

一个可能的解决方案是使用一个 Mocking 框架,该框架支持构建实现许多接口的模拟,如另一个线程中指出的接口(替代): Mocking DBSet,EF Model First

在这里,您有一个实用程序函数来构建一个模拟 DBSet,其数据存储在一个通用列表中:

public static DbSet<T> BuildMockedDbSet<T>(List<T> data) where T : class
    {
        IQueryable<T> queryable = data.AsQueryable();
        DbSet<T> fakeDbSet = Substitute.For<DbSet<T>, IQueryable<T>>();
        ((IQueryable<T>)fakeDbSet).Provider.Returns(queryable.Provider);
        ((IQueryable<T>)fakeDbSet).Expression.Returns(queryable.Expression);
        ((IQueryable<T>)fakeDbSet).ElementType.Returns(queryable.ElementType);
        ((IQueryable<T>)fakeDbSet).GetEnumerator().Returns(queryable.GetEnumerator());
        fakeDbSet.AsNoTracking().Returns(fakeDbSet);
        return fakeDbSet;
    }

希望能帮助到你。

于 2016-09-26T14:12:46.803 回答