Я только начинаю работать с RavenDB, и пока мне это нравится. Однако я застрял в том, как я должен выполнять действия контроллера модульного тестирования, которые взаимодействуют с ним.
Все вопросы/статьи, которые я нашел, подобные этой:Модульное тестирование запросов RavenDb говорят мне, что я должен использовать RavenDB в памяти, а не издеваться над ней, но я не могу найти надежный пример того, как это делается.
Например, у меня есть действие контроллера для добавления сотрудника в базу данных (да, это слишком упрощено, но я не хочу усложнять проблему)
public class EmployeesController : Controller
{
IDocumentStore _documentStore;
private IDocumentSession _session;
public EmployeesController(IDocumentStore documentStore)
{
this._documentStore = documentStore;
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
_session = _documentStore.OpenSession("StaffDirectory");
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (_session != null && filterContext.Exception == null) {
_session.SaveChanges();
_session.Dispose();
}
}
[HttpGet]
public ViewResult Create()
{
return View();
}
[HttpPost]
public RedirectToRouteResult Create(Employee emp)
{
ValidateModel(emp);
_session.Store(emp);
return RedirectToAction("Index");
}
Как я могу проверить, что было добавлено в базу данных в модульный тест? Есть ли у кого-нибудь примеры модульных тестов с использованием RavenDb в приложениях MVC?
Если это имеет значение, я использую MSTest, но с удовольствием попробую перевести тесты из других фреймворков.
Спасибо.
РЕДАКТИРОВАТЬ
Хорошо, инициализация моего теста создает хранилище документов, которое вводится в конструктор контроллера, но когда я запускаю свой тест, событие OnActionExecuting не запускается, поэтому нет сеанса для использования, и тест завершается с ошибкой исключение нулевой ссылки.
[TestClass]
public class EmployeesControllerTests
{
IDocumentStore _store;
[TestInitialize]
public void InitialiseTest()
{
_store = new EmbeddableDocumentStore
{
RunInMemory = true
};
_store.Initialize();
}
[TestMethod]
public void CreateInsertsANewEmployeeIntoTheDocumentStore()
{
Employee newEmp = new Employee() { FirstName = "Test", Surname = "User" };
var target = new EmployeesController(_store);
ControllerUtilities.SetUpControllerContext(target, "testUser", "Test User", null);
RedirectToRouteResult actual = target.Create(newEmp);
Assert.AreEqual("Index", actual.RouteName);
// verify employee was successfully added to the database.
}
}
Что я упускаю? Как создать сеанс для использования в тесте?