Как я могу подделать ObjectContext? - PullRequest
0 голосов
/ 07 октября 2011

Как я могу подделать ObjectContext при модульном тестировании?Я создал свой общий репозиторий, который исключает ObjectContext, подделал ObjectSets, но я не могу понять, как создать и передать поддельный ObjectContext, содержащий поддельные ObjectSets, в мой репозиторий.Мой репозиторий принимает класс типа 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 ]

1 голос
/ 08 октября 2011

Ваш репозиторий не может принять экземпляр ObjectContext - вы должны определить свой пользовательский интерфейс, реализованный как вашим реальным производным контекстом, так и поддельным контекстом.Ваш репозиторий должен принять этот интерфейс.В любом случае, фальсификация контекста - это пустая трата времени и совершенно плохой подход к тестированию кода с использованием EF .

0 голосов
/ 09 сентября 2013

Я бы не стал бы притворяться / издеваться над ObjectContext , так как этот объект представляет сложные внутренние операции , и для этого опровергает цель полагаться на Entity Framework для заботиться о абстракции уровня данных.

Ознакомьтесь с постом на Как смоделировать ObjectContext или ObjectQuery в Entity Framework? для лучшего подхода к проведению модульных тестов с EF.

Надеюсь, это поможет!

0 голосов
/ 07 октября 2011

Измените ваш репозиторий так, чтобы он использовал IObjectSet, а не ObjectSet, после чего вы можете передать свой фальшивый контекст в репозиторий так же, как в реальной реализации.В качестве альтернативы используйте IOC для вставки контекста.

...