如何在单元测试时伪造ObjectContext?我创建了我的通用存储库,除了ObjectContext,伪造了ObjectSets,但我无法弄清楚如何创建并将包含伪ObjectSets的伪ObjectContext传递到我的存储库中。我的存储库接受一个ObjectContext类型的类。
有什么想法吗?
public class FakeObjectSet<T> : IObjectSet<T> where T : class {
HashSet<T> _data;
IQueryable _query;
public FakeObjectSet(){
this._data = new HashSet<T>();
this._query = this._data.AsQueryable();
}
public void AddObject(T Item) {
this._data.Add(Item);
}
public void Attach(T Item) {
this._data.Add(Item);
}
public void DeleteObject(T Item) {
this._data.Remove(Item);
}
public void Detach(T Item) {
this._data.Remove(Item);
}
public IEnumerator<T> GetEnumerator() {
return this._data.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return _data.GetEnumerator();
}
public Type ElementType {
get { return _data.AsQueryable().ElementType; }
}
public Expression Expression {
get { return _data.AsQueryable().Expression; }
}
public IQueryProvider Provider {
get { return _query.Provider; }
}
}
我的虚假对象集实现
public class FakeJobSet : FakeObjectSet<Job>{
}
和我的假上下文类:
public class FakeCentralRepositoryContext{
public FakeCentralRepositoryContext(){
this.Jobs = new FakeJobSet();
}
public IObjectSet<Job> Jobs
{
get; private set;
}
}
答案 0 :(得分:1)
您的存储库无法接受ObjectContext
的实例 - 您必须定义由实际派生的上下文和伪上下文实现的自定义接口。您的存储库必须接受该接口。无论如何伪造上下文是waste of time and completely bad approach to testing code using EF。
答案 1 :(得分:0)
修改您的存储库以获取IObjectSet而不是ObjectSet,然后您可以像传递实际实现一样将伪上下文传递到存储库。或者,使用IOC注入上下文。
答案 2 :(得分:0)
我会避免伪造/模仿ObjectContext 作为此对象presents complex inner workings,并且这样做会违背依赖Entity Framework来处理数据层抽象的目的。
查看How to mock ObjectContext or ObjectQuery in Entity Framework?上的帖子,了解使用EF进行单元测试的更好方法。
希望这有帮助!