Итак, я в значительной степени чувствую себя немного расстроенным из-за предлагаемых Microsoft учебных пособий - я считаю, что есть контракты, которые упускаются, но я удивлен, что нигде не обнаружено.Mock Entity Framework с памятью Тест Double
Я пытаюсь реализовать двойной тест памяти для определенной реализации Entity Framework 5. Я пробовал MSDN's tutorial on EF 6, и он работает очень много (и, очевидно, данные только постоянны для одного контекста - причиной того, что DbSet ссылается только в данном контексте). Тем не менее, учебник, предложенный Microsoft for EF 5 and earlier, он просто не разрезает на него. Уверен, что некоторые контракты возникают, потому что я получаю «Невозможно неявно преобразовать тип ..FakeSomeModelDbSet в System.Data.Entity.DbSet»! Но не знаю, что я должен положить на часть :
(продлить) и что еще я должен переопределить.
В основном, здесь моя база издеваться реализация DbSet:
abstract class MockDbSet<T> : IDbSet<T> where T : class
{
#region Properties
protected ObservableCollection<T> _data;
protected IQueryable _query;
Type IQueryable.ElementType
{
get { return this._query.ElementType; }
}
System.Linq.Expressions.Expression IQueryable.Expression
{
get { return this._query.Expression; }
}
IQueryProvider IQueryable.Provider
{
get { return this._query.Provider; }
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _data.GetEnumerator();
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return _data.GetEnumerator();
}
#endregion
#region Public Methods
public MockDbSet()
{
this._data = new ObservableCollection<T>();
this._query = _data.AsQueryable<T>();
}
public T Find(params object[] keyValues)
{
return this._data.Single(x => this._GetObjectKey(x) == (Guid)keyValues.Single());
}
public T Add(T entity)
{
this._data.Add(entity);
return entity;
}
public T Remove(T entity)
{
this._data.Remove(entity);
return entity;
}
public T Attach(T entity)
{
this._data.Add(entity);
return entity;
}
public T Detach(T entity)
{
this._data.Remove(entity);
return entity;
}
public T Create()
{
return Activator.CreateInstance<T>();
}
public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T
{
return Activator.CreateInstance<TDerivedEntity>();
}
public ObservableCollection<T> Local
{
get { return this._data; }
}
#endregion
#region Protected Methods
protected abstract Guid _GetObjectKey(T entity);
#endregion
}
И вот один из его реализация, которая предназначена для замены оригинальных DbSet
:
class FakeSomeModelbSet : MockDbSet<SomeModel>
{
protected override Guid _GetObjectKey(SomeModel entity)
{
return entity.SomeModelId;
}
}
А вот как я собираюсь зацепить все вещи в определенном DbContext
..
class MockingContext:OriginContext
{
public MockCpdContext()
{
base.SomeModel = new FakeSomeModelbSet();
}
}
Не просите меня использовать Moq, добавив, что библиотека - это не гонка, так как я не ответственное лицо просто низкопробный гудок. Если вы спросите меня о внедрении OriginContext, он был сгенерирован подходом Database-first
.. так что я могу, но это не поможет.
Честно говоря, разгадка лежит на разнице в учебник кода (public class FakeDbSet<T> : IDbSet<T>
) и реализации оригинальный DbSet (public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter where TEntity : class
) подписи .. но не знаю, что делать .. на самом деле.