如何为使用StructureMap和NHibernate的asp.net mvc站点单元测试控制器?

时间:2010-03-22 16:11:28

标签: asp.net-mvc unit-testing nhibernate

我有一个使用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对象。我基本上以同样的方式使用它。

2 个答案:

答案 0 :(得分:1)

我会将您的查询重构为服务层本身。我建议这样做的原因是你可以在一个地方拥有所有的安全性,预测,分页,过滤等。即使您现在没有这些问题,如果所有内容都没有在不同的控制器操作中散布,也会更容易在以后添加它们。

通过这种拆分,您可以轻松地对GetAllPosts()方法进行单元测试。 (要么模拟你的仓库,要么只是插入内存数据库。)至于测试控制器动作,它基本上是一个服务调用,所以你会从测试中获得任何好处吗?在我看来,可能不是。

// service
public IQueryable<Post> GetAllPosts()
{
   return postRepository.QueryOver<Post>().Future();
}

// controller public ActionResult Index() { return View(_postService.GetAllPosts()); }

答案 1 :(得分:0)

要对您的控制器操作进行单元测试,您必须模拟您的服务,因为它是一个超出被测单元范围的外部进程。

但不,你不必假设你的服务会起作用。您应编写集成测试,以确保您的服务正常运行。

单元测试将为您提供有关Controller行为和服务行为集成测试的信息。一旦你两个都被覆盖,你就可以了。