Estoy empezando con RavenDB y me gusta hasta ahora. Sin embargo, estoy atascado en cómo debería probar las acciones del controlador de la unidad que interactúan con él.ASP.NET MVC, RavenDb y Pruebas unitarias
Todas las preguntas/artículos que he encontrado como este: Unit testing RavenDb queries dime que debería usar RavenDB en memoria en lugar de burlarlo pero no puedo encontrar un ejemplo sólido de cómo se hace esto.
Por ejemplo, tengo una acción de controlador para agregar un empleado de la base de datos (sí, es excesivamente simplificada pero no quieren complicar el asunto)
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");
}
¿Cómo puedo comprobar lo que se añade a la base de datos en una prueba de unidad? ¿Alguien tiene algún ejemplo de pruebas unitarias que involucren a RavenDb en aplicaciones MVC?
Estoy usando MSTest si eso es importante, pero me complace probar y traducir las pruebas de otros marcos.
Gracias.
EDITAR
Ok, mi initialise prueba crea el almacén de documentos que se inyecta en el constructor del controlador, pero cuando corro mi prueba el evento OnActionExecuting no se ejecuta lo que no hay sesión de usar y la prueba falla con una excepción de referencia nula.
[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.
}
}
¿Qué me falta? ¿Cómo puedo crear la sesión para usar en la prueba?
He actualizado mi pregunta, véase más adelante –