В настоящее время я тестирую Entity Framework DbContext
с использованием базы данных в памяти.
Чтобы сделать тесты как можно более атомарными, DbContext
уникален для каждого метода тестирования и заполняется исходными данными, необходимыми для каждого теста.
Чтобы установить начальное состояние DbContext
, я создал метод void SetupData
, который заполняет контекст некоторыми сущностями, которые я буду использовать в тестах.
Проблема с этим подходом заключается в том, что тест не может получить доступ к объектам, созданным во время установки, потому что Entity Framework сама назначит идентификаторы, которые неизвестны до времени выполнения.
Чтобы преодолеть эту проблему, я подумал, что мой метод SetupData
может стать чем-то вроде этого:
public Fixture SetupData(MyContext context)
{
var fixture = new Fixture();
fixture.CreatedUser = new User();
context.Users.Add(fixture.CreatedUser);
context.SaveChanges();
return fixture;
}
public class Fixture
{
public User CreatedUser { get; set;}
}
Как видите, он возвращает экземпляр того, что я назвал "Fixture". (Не знаю, подходит ли это имя).
Таким образом, SetupData
вернет объект (Fixture
) со ссылками на объекты. Таким образом, тест может использовать созданный объект. В противном случае объект будет невозможно идентифицировать, поскольку идентификатор не создается до тех пор, пока не будет вызван SaveChanges
.
Мой вопрос:
- Это плохая практика?
- Есть ли лучший способ ссылаться на исходные данные?
return context.Users.First()
(или даже простоreturn user;
)? - person Camilo Terevinto   schedule 19.04.2018