Ситуация такая
EntityFramework 5, Database First
Есть сущность, в ней есть метод которой использует CreateSourceQuery
public class Entity1
{
public EntityCollection<Entity2> Entities2 { get; set; }
public Entity2 GetEntity2(Guid id)
{
return Entities2.CreateSourceQuery().Single(x => x.ID == id);
}
}
Если что, CreateSourceQuery это такой особенный метод EF-а, который позволяет из EntityCollection сделать IQueryable
Ибо если этого не сделать то все попытки вызвать какой-то linq по такой коллекции благополучно загрузят всё в память, что, ясное дело, может быть чревато
И в общем то все бы ничего, но когда пытаешься протестировать этот метод, не используя всякие штуки типа Effort (In-memory db для EF), а сказав
Entities2 = new EntityCollection<Entity2>() { new Entity2(), ... };
то CreateSourceQuery возвращает null и наш тест благополучно валится
в ответе прямо намекают что это должен быть скорее интеграционный тест нежели юнит, но меня в данном случае интересует только юнит-тесты
я решил этот вопрос так: заменил использование CreateSourceQuery на собственный метод GetQueryable и в конфигурации ioc контейнера для тестов устанавливаю значение IsTests в true,
надеясь на то что это произойдёт раньше вызова GetQueryable
public static class CreateSourceQueryHack
{
public bool IsTests { get; set; }
public static IQueryable<T> GetQueryable<T>(this EntityCollection<T> entityCollection) where T : class
{
if (IsTests)
{
return entityCollection.AsQueryable();
}
else
{
return entityCollection.CreateSourceQuery();
}
}
}
Проблемы вижу две:
Соглашение о неиспользовании CreateSourceQuery
Соглашение об установке IsTests
Хочется узнать какие еще могут быть проблемы и как можно по-другому это дело решить?