使用RhinoMocks和EF6 </t>模拟DbSet <t>

时间:2014-08-11 13:55:06

标签: unit-testing dbset

运行测试时出现此错误:System.NotImplementedException:成员&#39; IQueryable.Provider&#39;尚未在类型&#39; DbSet&#39;上实施...&#39; 我看到this blog post创建了一个假的dbSet,但那是在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);
}

1 个答案:

答案 0 :(得分:0)

虽然DBSet实现了IQueryable,IDbSet ......模拟引擎生成的对象没有实现它们。

一种可能的解决方案是使用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;
    }

希望它有所帮助。