我正在使用 ASP.NET MVC 3、MVCContrib、NUnit 和 Rhino Mocks。我已经发布了这个但无法得到答案。人们更多地关注我的编码,以帮助我获得一个体面的答案以通过此测试。
我正在尝试测试我的编辑视图。我不确定如何为视图编写测试代码。它是 NewsEditViewData 类型的强类型视图。
当视图加载时,它通过 ID 从新闻服务中获取新闻项的数据。所以在我的测试中,我创建了一个新闻服务的存根:
var id = 1;
var news = new News();
newsServiceStub
.Stub(x => x.FindById(id))
.Return(news);
现在我需要将此新闻项映射到 NewsEditViewData。我有一个映射器(AutoMapper)为我做这件事,在我的测试中我做了以下事情:
newsMapperStub
.Stub(x => x.Map(news, typeof(News), typeof(NewsEditViewData)))
.Return(newsEditViewData);
我不确定到目前为止我是否走在正确的轨道上?
然后我有以下代码:
// Act
var actual = sut.Edit(id);
不要从我的代码中工作,我想要一个遵循最佳实践的答案。那么我需要在断言部分检查什么?我是否还需要检查记录是否已返回?我的想法是这样的:
actual
.AssertViewRendered()
.WithViewData<NewsEditViewData>()
.ShouldBe(newsEditViewData);
这失败了。有人可以帮我重写这个测试,让它通过。我希望它检查所有需要检查的内容。
这是完整的测试:
[Test]
public void Edit_should_render_Edit_view()
{
// Arrange
var id = 1;
var news = new News();
var newsEditViewData = new NewsEditViewData();
newsServiceStub
.Stub(x => x.FindById(id))
.Return(news);
newsMapperStub
.Stub(x => x.Map(news, typeof(News), typeof(NewsEditViewData)))
.Return(newsEditViewData);
// Act
var actual = sut.Edit(id);
// Assert
actual
.AssertViewRendered()
.WithViewData<NewsEditViewData>()
.ShouldBe(newsEditViewData);
}
2011-02-14 更新:
在我的 NewsController 我有以下内容:
private INewsService newsService;
private IMapper newsMapper;
public NewsController(INewsService newsService)
{
Check.Argument.IsNotNull(newsService, "newsService");
this.newsService = newsService;
newsMapper = new NewsMapper(); // TODO: Use dependency injection
}
动作方法如下所示:
public ActionResult Edit(int id)
{
Check.Argument.IsNotZeroOrNegative(id, "id");
var news = newsService.FindById(id);
var newsEditViewData = (NewsEditViewData)newsMapper.Map(news, typeof(News), typeof(NewsEditViewData));
return View(newsEditViewData);
}
我在 NUnit 中遇到的错误是:
MyProject.Web.UnitTests.Controllers.NewsControllerTests.Edit_RenderView_EditView: MvcContrib.TestHelper.AssertionException : 是 MyProject.Web.Common.ViewData.NewsEditViewData 但预期 MyProject.Web.Common.ViewData.NewsEditViewData