Как создать ObjectQuery для тестирования метода EF4 «Включить» - PullRequest
0 голосов
/ 18 августа 2011

Мы используем EF4 и создаем контрольные примеры для уровня DAL (уровень DAL имеет запрос linq). Мы используем TypeMock в качестве основы для насмешек. Для тестирования мы создаем фальшивый текст ObjectContext и метод насмешки CreateObjectSet следующим образом:

Isolate.WhenCalled(() => fakeContext.Context.CreateObjectSet<User>)).WillReturnCollectionValuesOf(fakeUsers.AsQueryable()); 

Выше работает нормально. Проблема в том, что мы пытаемся включить связанные таблицы, используя «Включить». Мы расширили метод include следующим образом:

public static IQueryable<T> Include<T>(this IQueryable<T> source, Expression<Func<T>> property)
{ 
    var objectQuery = source as ObjectQuery<T>; 

    if (objectQuery != null) 
    { 
        var propertyPath = GetPropertyPath(property); 
        return objectQuery.Include(propertyPath); 
    } 

    return source; 
}

Итак, что происходит, в приведенном выше методе Include тип источника должен быть ObjectQuery<T>. Но, как мы смоделировали CreateObjectSet, тип источника в методе Include имеет тип Collection.Generic.List. Пожалуйста, дайте нам знать, как мы должны издеваться в вышеуказанном случае. Ваша своевременная помощь будет весьма ощутимой. Спасибо

1 Ответ

0 голосов
/ 18 августа 2011

Объектные службы может быть сложно использовать при написании юнит-теста. К сожалению, не существует хорошего интерфейса для макета для ObjectQuery<T>, как вы выяснили. Чтобы справиться с этим сценарием, я создал класс-оболочку по шаблону Repository для инкапсуляции моего ObjectContext и создал класс-оболочку для инкапсуляции ObjectQuery<T>:

public interface IMyObjectQuery<T> : IOrderedQueryable<T>
{
    IMyObjectQuery<T> Include(string path);
}

public class MyObjectQuery<T> : IMyObjectQuery<T>
{
    private ObjectQuery<T> _query;

    public MyObjectQuery(ObjectQuery<T> query)
    {
        _query = query;
    }

    IMyObjectQuery<T> Include(string path)
    {
        //There is probably a better way to do this
        //but you get the idea
        return new MyObjectQuery(_query.Include(path));
    }

    //Implement IQueryable, IEnumerable...
}

И тогда это вопрос реализации оболочки Repository для вашего ObjectContext. Здесь является ссылкой, с которой можно начать.

Добавить что-то вроде этого:

public class MyRepository : IMyRespository
{
    ...
    public IMyObjectQuery<T> CreateQuery<T>()
    {
        return new MyObjectQuery(_context.CreateQuery<T>());
    }
    ...
}

Вероятно, это не простое решение, которое вы искали, поскольку это не тривиальная задача. Я думаю, что вы обнаружите, что если вы этого не сделаете, вы будете продолжать сталкиваться с трудностями при написании тестов.

...