Имитация DbSet‹T› с помощью RhinoMocks и EF6

Я получаю эту ошибку, когда запускаю свой тест: 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);
}

person Robert    schedule 11.08.2014    source источник
comment
Принципы из этой ссылки остаются неизменными независимо от версии EF. Используйте интерфейс IMyContext, который предоставляет свойства IDbSet<> и имитирует их как FakeDbSet<>   -  person AlexFoxGill    schedule 11.08.2014
comment
@AlexG Итак, мне нужно будет создать реализации выражений Get IQueryably и позволить макету обрабатывать методы, не связанные с запросом?   -  person Robert    schedule 11.08.2014


Ответы (1)


Хотя DBSet реализует IQueryable, IDbSet... объект, сгенерированный фиктивным механизмом, не реализует их.

Возможным решением является использование платформы Mocking, которая поддерживает создание макетов, реализующих множество интерфейсов, подобных тому, который указан в другом потоке (замените): Имитация DBSet, сначала модель EF

Здесь у вас есть служебная функция для создания макета 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;
    }

Надеюсь, поможет.

person Héctor Espí Hernández    schedule 26.09.2016