Я только начинаю с юнит-тестирования и 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 с чем-то вроде этого approach- Mocking EF при модульном тестировании или непосредственно с использованием среды моделирования на интерфейсе, таком как moq - с болью от того, что модульные тесты могут проходить, но не обязательно работать из конца в конец и подкрепить их интеграционными тестами?
- Может быть, использовать что-то вроде Effort, чтобы издеваться над EF - я никогда не использовал его и не уверен, что кто-то еще использует его в дикой природе?
- Не беспокоиться о тестировании чего-либо, что просто вызывает EF - так что, по сути, сервисные методы, которые вызывают EF напрямую (getAll и т.д.), Не тестируются модульно, а просто тестируются на интеграцию?
Кто-нибудь на самом деле делает это без репо и имеет успех?