我怎么能伪造ObjectContext?

时间:2011-10-07 16:13:14

标签: c# entity-framework entity

如何在单元测试时伪造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;
    }
}

3 个答案:

答案 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进行单元测试的更好方法。

希望这有帮助!