ASP.NET MVC,RavenDb和单元测试
本文关键字:单元测试 RavenDb NET MVC ASP | 更新日期: 2023-09-27 18:32:54
我刚刚开始使用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");
}
如何验证在单元测试中添加了哪些内容? 有没有人有任何涉及 MVC 应用程序中 RavenDb 的单元测试示例?
如果这很重要,我正在使用 MSTest,但我很乐意尝试翻译来自其他框架的测试。
谢谢。
编辑
好的,我的测试初始化创建了注入到控制器构造函数中的文档存储,但是当我运行测试时,OnActionExecute 事件不会运行,因此没有要使用的会话,并且测试失败并出现空引用异常。
[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 内存模式的存在,因此您不必模拟它,您只需执行以下操作:
- 打开新的内存中嵌入式文档存储(无数据(
- 如果需要,插入单元测试需要运行的任何数据
- 运行单元测试
- 查看内存中存储中的数据,查看它是否已正确更新
更新 如果你想要一个完整的示例,看看RacoonBlog代码是如何做到的,这是运行Ayende博客的代码。请参阅以下 2 个文件:
- 博客配置行为.cs
- 浣熊控制器测试.cs
如何验证在单元测试中添加了哪些内容?
你没有。我们不会在单元测试中测试这些东西。这是集成测试的责任,而不是单元测试。
如果要对依赖于某些外部源(如数据库(的类进行单元测试,请模拟数据库访问。
编辑:
为了纠正一些提到的错误,我将引用MSDN的定义(但是所有其他资源都同意这一点(:
单元测试的主要目标是取最小的部分 应用程序中的可测试软件,将其与其余部分隔离 代码,并确定它的行为是否完全符合您的预期。
没有嘲笑你忽略了单元测试的基本原则 - 隔离和测试尽可能小的部分。单元测试需要持久忽略,并且不应该依赖于某些外部类。如果数据库随时间变化怎么办?重写所有测试,即使功能保持不变?
加油。你可以给我 -1 你想要多少次,但这不会让你对。
由于您提到的链接线程通过嵌入RavenDB来使用EmbeddableDocumentStore。
以下是设置方法:http://msdn.microsoft.com/en-us/magazine/hh547101.aspx
以下是将存储库模式与 raven 一起使用的方法,以便您轻松测试:http://novuscraft.com/blog/ravendb-and-the-repository-pattern