我正在使用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上,代码示例没什么用处。我希望听到尽可能多的意见。
感谢。
答案 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用于测试您可能会看到的视图。