У меня возникли проблемы с выяснением того, как издеваться над моей базой данных для модульного тестирования моих веб-контроллеров api. Все ресурсы, которые я нашел, работают для первого кода EF, но не сначала, когда мой контекст автогенерируется.Измельчение базы данных в EF6 db first
Проще говоря, я хочу, чтобы иметь возможность вызывать операции CRUD моего контроллера с поддельной базой данных, которую я создаю на лету, и я ищу самый простой способ сделать это.
Я пытаюсь использовать http://www.nogginbox.co.uk/blog/mocking-entity-framework-data-context, чтобы положить его вместе, но не может управлять ...
Мой контекст определяется как:
public partial class MyEntities : DbContext
{
public MyEntities()
: base("name=MyEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Company> Companies { get; set; }
Теперь я понимаю, что мне нужно создать IContext, которая позволяет издевательство над MyEntities, но я не могу понять, как это организовать.
Я попытался добавить ниже классы, но не могу понять, как это организовать.
public interface IContext
{
IObjectSet<Company> Companies { get; }
void SaveChanges();
}
public class EFContext: IContext
{
private readonly MyEntities _data;
public EFContext()
{
_data = new MyEntities();
}
public IObjectSet<Company> Companies
{
get
{
return _data.CreateObjectSet<Company>();
}
}
public void SaveChanges()
{
_data.SaveChanges();
}
}
Пример
Пример контроллера я хотел бы модульное тестирование, которое было бы очень легко сделать, если бы я мог издеваться базу данных, чтобы проверить против.
public IHttpActionResult Search([FromBody]string query)
{
var companies = CompanyRepository.Get().Where(c => c.Name.ToLower().Contains(query.ToLower()));
var people = PersonRepository.Get().Where(c => c.FirstName.ToLower().Contains(query.ToLower()) || c.LastName.ToLower().Contains(query.ToLower()));
List<SearchResult> results = new List<SearchResult>();
foreach(Company company in companies)
results.Add(new SearchResult { ID = company.ID, Name = company.Name, Type = "Company" });
foreach (Person person in people)
results.Add(new SearchResult { ID = person.ID, Name = person.FirstName + " " + person.LastName, Type = "Person" });
return Ok(results);
}
- Как я могу дразнить мой EF базу данных первого контекста использовать тестовую базу данных?
Спасибо @sarin. Я хочу, чтобы мои веб-контроллеры api состояли в основном из CRUD-операций. Таким образом, примерный тест может заключаться в том, чтобы добавить компанию через Add(); а затем убедитесь, что эта новая компания была добавлена. Я пытался следовать статье, которую вы связали изначально с помощью Moq, но я не мог понять, как заставить ее работать с тем, как был настроен мой DbContext (другим программистом) –
ok. У вас есть несколько вариантов. Единичный тест, который ваш контроллер WebApi вызывает метод добавления на вашем объекте, когда вы ожидаете его, и только один раз. Создайте тест интеграции, чтобы сделать, как вы говорите, I.e. вызовите метод добавления и затем проверьте, были ли данные добавлены в базу данных. Создайте тест блока базы данных и проверьте свою хранимую процедуру. В качестве альтернативы ни один из вышеперечисленных. Честно говоря, для чего-то такого тривиального я бы не стал беспокоиться. Корпорация Entity Framework уже протестирована Microsoft. Класс, который вы показали выше, просто передает запрос. Для меня это не гарантирует испытание. Более сложная логика, то да. – sarin
Это был простой пример, да, я обновил свой вопрос, чтобы включить более реалистичный вариант использования. Я не вижу, как единично тестировать в таком изолированном режиме, просто не тестируя макетную базу данных [которая все просто попадает через EF, как вы сказали]; но оцените предложения –