0

我将 MVC 2 与 MVC contrib 和 Rhino 模拟一起使用。

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

让我描述一下我的基本场景:我有一个索引视图,上面有一个网格。在这个网格中,我有一个新闻项目列表。在这个网格中,每一行的最后一列都有一个 Edit 链接,它将用户带到 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 上,代码示例也没多大用处。我想听到尽可能多的意见。

谢谢。

4

1 回答 1

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 测试来验证它们的行为是否符合预期。有不同的工具可以帮助你,比如Selenium ,或者如果你有 Visual Studio 的 Ultimate 版本,可以直接使用Web 测试。Steven Sanderson 还提出了一种有趣的方法来测试您可能会查看的视图。

于 2010-12-05T09:50:57.933 回答