所以,我非常感到有些微不足道的微軟建議的教程 - 我相信有合同被錯過,但我很驚訝,無處可尋找到線索。模擬實體框架與內存測試雙
我想在內存測試中實現對某個實體框架5實現的雙重實現。我嘗試了MSDN's tutorial on EF 6,它的工作原理非常簡單(顯然數據只對一個上下文持久 - 因爲DbSet只在給定的上下文中被引用)。但是,微軟建議的教程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
)簽名的區別..但不知道該怎麼辦..真的。