У меня есть приложение, которое содержит методы, которые работают с данными, используя Entity Framework 4.2 Code First и базу данных MySQL. Я пытаюсь найти хороший способ написать модульный тест MSTest для этих методов. Например:
DataModel:
public class User
{
public User() { }
[Key]
public int UserID { get; set; }
public string Role { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
}
Бизнес-уровень:
public class Bus
{
public bool UserIsInRole(int userID, string role)
{
using(var context = new AppDbContext())
{
User user = context.Users.SingleOrDefault(p => p.UserID == userID);
if (user == null)
return false;
return user.Roles.Split(',').Contains(role);
}
}
}
Я пытаюсь написать набор модульных тестов для функции UserIsInRole, но я хочу попытаться изолировать себя от необходимости читать и записывать в реальную базу данных, поскольку я не могу гарантировать ее состояние перед тестом. Настройка / удаление базы данных только для этого теста займет слишком много времени.
Я сталкивался со многими статьями об использовании поддельного DbContext, например, здесь , здесь и здесь но все они, похоже, имеют свои плюсы и минусы , Одна группа людей говорит, что не следует писать модульные тесты против EF и что это относится к интеграционному тестированию и что любой поддельный DbContext не ведет себя так, как настоящий, для целей приемлемых тестов.
Я думаю, что подобный код лежит где-то в середине аргумента. В идеале я хочу создать набор временных объектов в памяти, которые представляют нужные данные без необходимости фактически сохранять их в базе данных.
Как бы вы изменили вышеприведенное и написали набор тестов, проверяющих, что метод UserIsInRole:
- возвращает false, если userID не существует в Users
коллекция.
- возвращает false, если пользователь не содержит
желаемая роль.
- возвращает true, если у пользователя есть требуемая роль.
Имейте в виду, что это упрощенный пример и что код может фактически содержать несколько запросов произвольной сложности, поэтому я надеюсь найти что-то более всеобъемлющее, чем, скажем, перемещение каждого запроса в виртуальную функцию, которая заменяется на тестовый фреймворк для возврата предопределенной пользовательской записи.