运行测试时出现此错误:System.NotImplementedException:成员' IQueryable.Provider'尚未在类型' DbSet'上实施...' 我看到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);
}
答案 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;
}
希望它有所帮助。