How are people unit testing with Entity Framework 6, should you bother?

Я только начинаю с юнит-тестирования и TDD в целом. Раньше я баловался, но теперь я полон решимости добавить его в свой рабочий процесс и написать лучшее программное обеспечение.

Я задал вопрос вчера, что-то вроде этого, но, похоже, это вопрос сам по себе. Я сел приступить к реализации класса обслуживания, который буду использовать для абстрагирования бизнес-логики от контроллеров и сопоставления с конкретными моделями и взаимодействиями данных с помощью EF6.

Проблема в том, что я уже заблокировал себя, потому что я не хотел абстрагировать EF в репозитории (он все еще будет доступен за пределами сервисов для определенных запросов и т. Д.) И хотел бы протестировать мои сервисы (будет использоваться контекст EF) ,

Здесь, наверное, вопрос, есть ли смысл делать это? Если так, то как люди делают это в дикой природе в свете неплотных абстракций, вызванных IQueryable, и многих замечательных постовЛадислав Мрнка на предмет модульного тестирования, который не является простым из-за различий в поставщиках Linq при работе с реализацией в памяти в сравнении с конкретной базой данных.

Код, который я хочу проверить, кажется довольно простым. (это просто фиктивный код, чтобы попытаться понять, что я делаю, я хочу управлять созданием, используя TDD)

контекст

public interface IContext
{
    IDbSet<Product> Products { get; set; }
    IDbSet<Category> Categories { get; set; }
    int SaveChanges();
}

public class DataContext : DbContext, IContext
{
    public IDbSet<Product> Products { get; set; }
    public IDbSet<Category> Categories { get; set; }

    public DataContext(string connectionString)
                : base(connectionString)
    {

    }
}

обслуживание

public class ProductService : IProductService
{
    private IContext _context;

    public ProductService(IContext dbContext)
    {
        _context = dbContext;
    }

    public IEnumerable<Product> GetAll()
    {
        var query = from p in _context.Products
                    select p;

        return query;
    }
}

В настоящее время я собираюсь сделать несколько вещей:

Mocking EF Context с чем-то вроде этого подходаИздевательский EF при модульном тестировании или непосредственно с помощью фальшивой инфраструктуры на интерфейсе, такой как moq, - терпеть боль, которую могут пройти модульные тесты, но не обязательно работать из конца в конец, и подкрепить их интеграционными тестами?Может быть, используя что-то вродеусилие чтобы издеваться над EF - я никогда не использовал его и не уверен, что кто-то еще использует его в дикой природе?Не беспокойтесь о тестировании чего-либо, что просто вызывает EF - так что, по сути, сервисные методы, которые вызывают EF напрямую (getAll и т. Д.), Не тестируются модулем, а просто проверяются на интеграцию?

Кто-нибудь на самом деле делает это без репо и имеет успех?

Ответы на вопрос(10)

Ваш ответ на вопрос