我有一个使用StructureMap 2.6和NHibernate 3.x的asp.net mvc2应用程序。我想将单元测试添加到应用程序中,但对于如何完成它有点不知所措。
假设我有一个名为Posts的基本控制器,它有一个名为Index的动作。控制器看起来像:
public class PostsController : Controller {
private readonly IPostService _postService;
public PostsController(IPostService postService) {
_postService = postService;
}
public ActionResult Index() {
return View(_postService.QueryOver<Post>().Future());
}
}
如果我想创建一个nunit测试来验证索引操作是否正在返回所有帖子,我该如何解决?如果建议进行模拟,您是否只是假设与数据库的交互有效?
很抱歉提出这么广泛的问题,但我的网络搜索没有找到任何合适的单位测试使用StructureMap(或任何其他IOC)和NHibernate的asp.net mvc操作。
顺便说一下,如果你不喜欢我从我的邮政服务中返回一个QueryOver对象,假装它是一个IQueryable对象。我基本上以同样的方式使用它。
答案 0 :(得分:1)
我会将您的查询重构为服务层本身。我建议这样做的原因是你可以在一个地方拥有所有的安全性,预测,分页,过滤等。即使您现在没有这些问题,如果所有内容都没有在不同的控制器操作中散布,也会更容易在以后添加它们。
通过这种拆分,您可以轻松地对GetAllPosts()方法进行单元测试。 (要么模拟你的仓库,要么只是插入内存数据库。)至于测试控制器动作,它基本上是一个服务调用,所以你会从测试中获得任何好处吗?在我看来,可能不是。
// service
public IQueryable<Post> GetAllPosts()
{
return postRepository.QueryOver<Post>().Future();
}
// controller
public ActionResult Index() {
return View(_postService.GetAllPosts());
}
答案 1 :(得分:0)
要对您的控制器操作进行单元测试,您必须模拟您的服务,因为它是一个超出被测单元范围的外部进程。
但不,你不必假设你的服务会起作用。您应编写集成测试,以确保您的服务正常运行。
单元测试将为您提供有关Controller行为和服务行为集成测试的信息。一旦你两个都被覆盖,你就可以了。