Я пишу модульные тесты для своего уровня обслуживания, и я полностью вижу смысл создания модульных тестов для проверки логики. Например, если я создаю функцию, которая добавляет два числа, обязательно напишите для этого единичный тест.Какие-либо методы тестирования единиц измерения, которые используют EF или Linq?
Но если в моем методе обслуживания слоя у меня есть что-то вроде этого
public ICollection<MyEntity> GetAll()
{
return _context.MyEntities
.Where(e => !e.IsDeleted)
.ToList();
}
Что такое точка в блоке тестирования это? Поскольку я получаю это из базы данных, кажется глупому издеваться над базой данных, потому что я просто предполагаю, что Linq работает так, как должно быть?
Не было бы лучше протестировать это против реальной базы данных «test» с данными одинакового размера. Таким образом, я могу узнать, соответствует ли количество записей, полученных из базы данных, тем, что я ожидаю?
Я знаю, что тестирование против базы данных делает это более интеграционным тестом, но действительно ли это подходит для модульного тестирования?
Что делать, если я еще один пример, скажем, это
public int Delete(long id)
{
_context.Database.ExecuteCommand("DELETE FROM myTable WHERE Id = ?", id);
return _context.SaveChanges();
}
Как эта функция может быть протестированы? Если я mock _context.Database и создаю единичный тест, который проверяет, вызывает ли _context.SaveChanges (что я не вижу смысла в том, что так когда-либо), нет никаких гарантий, что он фактически удалит мои данные. Что, если у меня есть ограничение внешнего ключа? Макет прошел бы, но реальный метод действительно потерпел бы неудачу?
Я только начинаю думать, что, если метод фактически не вычисляет какую-то логику, я не вижу смысла/причины для создания модульного теста, особенно при использовании инфраструктуры Entity?
Вы должны выполнить его проверку, чтобы убедиться, что ваш код Linq верен. Что, если бы вы набрали '.Where (e => e.IsDeleted) .ToList();' по ошибке, или кто-то случайно отредактировал его или иначе сломал его позже? –
Используйте макет для модульного тестирования. Использование реальной базы данных - это интеграционное тестирование. –
IMO в таких сценариях, где тестовый код скоро окажется более сложным, чем производственный код - хороший средний уровень - это тесты поведения («после того, как я добавил что-то в свою базу данных, я могу найти его снова ...») - но это только [мое мнение] (https://www.youtube.com/watch?v=XVCtkzIXYzQ) (и я думаю, что это проблема с этим потоком - извините) – Carsten