CSharp - C# ASP.NET MVC,RavenDb和单元测试

  显示原文与译文双语对照的内容

我刚开始 RavenDB,我喜欢到现在为止。 然而,我仍然坚持 单元测试 控制器操作与它交互的方式。

我发现的所有问题/文章都是这样的: 单元测试RavenDB查询告诉我应该在内存中使用 RavenDB,但是我不能mock它,但是我无法找到如何做到这一点的坚实。

例如,我有一个控制器操作向数据库添加一个员工( 是的,它过于简化,但我不想复杂)


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");


 }



如何验证在 单元测试 中添加到数据库中的内容? 是否有人在MVC应用程序中有涉及RavenDb的单元测试的例子?

如果有问题,我正在使用 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.


 }


}



我缺少什么如何让创建的会话在测试中使用?

时间: 原作者:

在运行 单元测试 之后,只需 assert 在数据库中有一个新的文档,并且它的字段设置正确。


var newDoc = session.Load<T>(docId)



或者


var docs = session.Query<T>.Where(....).ToList();



在内存模式中,RavenDB不必模仿,只需执行以下操作:

  • 在嵌入式内存中打开一个新的嵌入式文档存储( 没有数据)
  • 如果需要,请插入你的单元测试 需要运行的任何数据
  • 运行 单元测试
  • 查看内存存储中的数据,看看它是否已经正确更新

如果你想要完整的样本,那么你可以用一个的RacoonBlog代码,这是你正在运行的ayende博客。 查看以下 2个文件:

原作者:
...