0

我使用MVC 2与MVC contrib和Rhino mocks。ASP.NET MVC 2:在视图和控制器中测试什么

我需要帮助。这是一个痛苦的周末。我一直在寻找关于如何在使用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"); 
} 

更新: 这里是我Index操作方法:

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

什么像样的文章或示例代码,将不胜感激。同样在MVC贡献中,代码示例没有多大用处。我希望听到尽可能多的意见。

谢谢。

回答

1

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

MVCContrib.TestHelper和Rhino Mocks旨在简化您的单元测试。所以在你的情况下,你应该测试你的控制器动作。如果没有显示这个控制器操作的代码,很难说你需要测试什么。一般来说,你可以在控制器动作中进行单元测试,它可以验证输入,调用存储库中的正确方法,并根据结果返回适当的视图。

因此,让我们假设你有以下索引操作你愿意测试:

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,有不同的工具可以帮助您,例如Selenium或直接使用Web Tests。史蒂文桑德森还proposed an interesting approach测试意见,你可以看看。

+0

查看更新后的帖子。我仍然不明白这一点。我在上面提到的测试,到目前为止是在线?你还有什么单元测试和集成测试?如果你可以提供一些样品,那么我会赞赏这一点。 – 2010-12-05 09:57:29