Sono appena iniziato con RavenDB e mi piace fino ad ora. Sono comunque bloccato su come dovrei unità di testare le azioni del controller che interagiscono con esso.ASP.NET MVC, RavenDb e Unit Testing
Tutte le domande/articoli che ho trovato come questo: Unit testing RavenDb queries dimmi che dovrei usare RavenDB in memoria piuttosto che deriderlo via ma non riesco a trovare un esempio solido di come questo è fatto.
Per esempio io ho un'azione di controllo per aggiungere un dipendente al database (sì, è eccessivamente semplificata, ma non voglio complicare la questione)
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");
}
Come si può verificare ciò che è stato aggiunto al il database in un test unitario? Qualcuno ha qualche esempio di test unitari che coinvolgono RavenDb in applicazioni MVC?
Sto usando MSTest se questo è importante, ma sono felice di provare a tradurre test da altri framework.
Grazie.
EDIT
Ok, la mia prova di inizializzazione crea l'archivio di documento che viene iniettato nel costruttore di controllo, ma quando ho eseguito la mia prova l'evento OnActionExecuting non viene eseguito in modo non c'è nessuna sessione da utilizzare e il test fallisce con un'eccezione di riferimento null.
[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.
}
}
Cosa mi manca? Come posso creare la sessione da utilizzare nel test?
Ho aggiornato la mia domanda, vedi sotto –