ASP.NET MVC 2:在视图和控制器中测试什么

时间:2010-12-05 09:21:04

标签: asp.net-mvc unit-testing integration-testing mvccontrib-testhelper

我正在使用MVC 2和MVC contrib以及Rhino模拟。

我需要帮助。这是一个痛苦的周末。我一直试图寻找关于如何使用MVC contrib对控制器进行测试的好文章。没有人对我有任何正当的答案。我想知道在视图和控制器中测试需要什么?这是单元测试还是集成测试?

让我描述一下我的基本场景:我有一个索引视图,上面有一个网格。在这个网格中,我有一个新闻列表。在此网格中,在每行的最后一列中,是一个编辑链接,它将用户带到EditNews视图以编辑选定的新闻项。此索引视图上还有一个“添加新闻”按钮,用于将用户带到CreateNews视图。

现在根据当前情况,我需要编写哪些测试?你们还能说明它们是单元测试还是集成测试。我是否需要为编辑链接编写测试?我是否需要为“添加新闻”按钮编写测试?我是否需要编写测试以检查此索引页面上是否允许用户?这就是我目前所拥有的:

[Test]
public void Index_Should_Redirect_To_Error_View_When_User_Does_Not_Have_Permission()
{
}

[Test]
public void Index_Should_Log_Exception_When_User_Does_Not_Have_Permission()
{
}

[Test]
public void Index_Should_Return_Default_View()
{
   // Act
   var result = newsController.Index();

   // Assert
   result
      .AssertViewRendered()
      .ForView("Index");
}

更新: 这是我的索引操作方法:

public ActionResult Index()
{
   IEnumerable<News> news = newsRepository.FindAll();
   return View(news);
}

任何体面的文章或示例代码将不胜感激。同样在MVC contrib上,代码示例没什么用处。我希望听到尽可能多的意见。

感谢。

1 个答案:

答案 0 :(得分:1)

您需要区分单元测试,集成测试和Web测试。单元测试用于测试代码的不同组件,例如隔离的控制器操作。集成测试用于测试代码和外部组件之间的集成,例如从数据库读取和写入数据的存储库,Web测试用于测试应用程序的整个用户场景,例如用户在地址栏中键入一些地址他的浏览器,点击某个按钮,...

MVCContrib.TestHelper和Rhino Mocks旨在简化您的单元测试。因此,在您的方案中,您应该测试Index控制器操作。如果不显示此控制器操作包含的代码,则很难说您需要测试什么。通常,您可以在控制器操作中进行单元测试的是它验证输入,调用存储库上的正确方法,并根据结果返回正确的视图。

因此,假设您有以下愿意测试的Index操作:

public class HomeController: Controller
{
    private readony INewRepository _repository;
    public HomeController(INewRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        var news = _repository.GetNews();
        return View(news);
    }
}

相应的单元测试:

[TestClass]
public class HomeControllerTests : TestControllerBuilder
{
    private HomeController _sut;
    private INewsRepository _repositoryStub;

    [TestInitialize()]
    public void MyTestInitialize() 
    {
        _repositoryStub = MockRepository.GenerateStub<INewsRepository>();
        _sut = new UsersController(_repositoryStub);
        InitializeController(_sut);
    }

    [TestMethod]
    public void UsersController_Index_Should_Fetch_News_From_Repository()
    {
        // arrange
        var news = new News[0];
        _repositoryStub.Stub(x => x.GetNews()).Return(news);

        // act
        var actual = _sut.Index();

        // assert
        actual
            .AssertViewRendered()
            .WithViewData<News[]>()
            .ShouldBe(news);
    }
}

就您的观点而言,您需要编写Web测试以验证它们的行为是否符合预期。如果您拥有Visual Studio的Ultimate版本,有不同的工具可以帮助您,例如Selenium或直接使用Web Tests。史蒂文桑德森也proposed an interesting approach用于测试您可能会看到的视图。