2016-12-05 4 views
0

Итак, я в значительной степени чувствую себя немного расстроенным из-за предлагаемых 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) подписи .. но не знаю, что делать .. на самом деле.

ответ

0

Ну, я просто понял, что в Entity Framework 5 DbSet имеет только один конструктор с внутренним модификатором . Невозможно непосредственно наследовать DbSet, это возможно только путем замены DbSet на DbContext на IDbSet, который можно редактировать только путем изменения файла .Context.tt.

Смежные вопросы