ASP.NET MVC,RavenDb和单元测试

我刚刚开始使用RavenDB,并且我喜欢它。然而,我坚持如何单元测试控制器与其交互的操作。ASP.NET MVC,RavenDb和单元测试

我已经找到像这样的所有问题/文章:Unit testing RavenDb queries告诉我我应该在内存中使用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");

}

我如何验证什么加入数据库在单元测试中?有没有人有MVC应用程序中涉及RavenDb的单元测试的例子?

我使用MSTest如果重要,但我很乐意尝试翻译来自其他框架的测试。

谢谢。

编辑

好吧,我测试的initialise创建注入的控制器构造文档存储,但是当我运行我的测试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.

}

}

我错过了什么?我如何获得在测试中创建的会话?

回答:

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

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

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

RavenDB内存模式是存在的,这样你就不必嘲笑它,你只需做到以下几点:

  • 打开新 - 内存嵌入式文档存储(无数据)
  • 如果需要插入单元测试运行所需的任何数据
  • RUN th E单元测试
  • 看在内存存储中的数据,看看它。如果你想有一个完整的样本已被正确

更新更新,看看在RacoonBlog代码是怎么做的,这是运行Ayende's blog的代码。见这2个文件:

  • BlogConfigBehavior.cs
  • RaccoonControllerTests.cs

回答:

由于您链接到的线程通过嵌入RavenDB来使用EmbeddableDocumentStore。

下面是如何设置了: http://msdn.microsoft.com/en-us/magazine/hh547101.aspx

下面介绍如何使用与乌鸦的存储库模式,让您可以轻松地测试: http://novuscraft.com/blog/ravendb-and-the-repository-pattern

回答:

我如何验证什么加入到数据库在单元测试?

你不知道。我们不在单元测试中测试这些东西。这是集成测试的责任,而不是单元测试。

如果你想单元测试依赖于某些外部源(如你的数据库)的类,模拟数据库访问。

编辑:

纠正一些错误提到,我会从MSDN引用定义(但所有其他资源同意这一点):

单元测试的主要目标是将这是应用程序中最小的 可测试软件,将其与 代码的其余部分隔离,并确定其行为是否与您期望的完全相同。

没有嘲笑你忽略了单元测试的基本原则 - 隔离和测试尽可能最小的一块。单元测试需要持久不变,不应该依赖于某些外部类。如果数据库随时间变化会怎样?重写所有测试,即使功能保持完全一样?

来吧。你可以给我多少次你想要的,但这不会让你变得正确。

以上是 ASP.NET MVC,RavenDb和单元测试 的全部内容, 来源链接: utcz.com/qa/262936.html

回到顶部