【问题标题】:Testing a get action with view model使用视图模型测试获取操作
【发布时间】:2011-01-19 11:19:48
【问题描述】:

我有以下控制器动作:

public ActionResult Edit(int id)
{
   var news = newsRepository.GetNewsByID(id);

   Mapper.CreateMap<News, NewsEditModel>();
   var newsEditModel =
      (NewsEditModel)Mapper.Map(news, typeof(News), typeof(NewsEditModel));

   return View(newsEditModel);
}

以及相应的测试:

[Test]
public void Edit_should_render_view()
{
   // Arrange
   var id = 1;
   var newsEditModel = new NewsEditModel();

   // Act
   var actual = sut.Edit(id);

   // Assert
   actual
      .AssertViewRendered()
      .WithViewData<NewsEditModel>()
      .ShouldBe(newsEditModel);
}

在 NUnit GUI 中出现以下错误:

MyProject.Web.UnitTests.Controllers.NewsControllerTests.Edit_should_render_view: MvcContrib.TestHelper.AssertionException :是 MyProject.Web.Common.ViewData.NewsEditModel 但预期 MyProject.Web.Common.ViewData.NewsEditModel

不知道怎么写对应的单元测试。有人可以帮帮我吗?

【问题讨论】:

    标签: asp.net-mvc nunit mvccontrib mvccontrib-testhelper


    【解决方案1】:

    您的测试正在比较NewsEditModel 的两个不同实例——一个是您在测试代码中创建的实例,另一个是在操作方法中创建的。

    如果您想在测试中检查模型属性值,您可以这样做:

    var model = actual
      .AssertViewRendered()
      .WithViewData<NewsEditModel>();
    
    // Check that model is not null
    Assert.That(model, Is.Not.Null);  
    
    // Check that model ID is same as passed into action method
    Assert.That(model.Id, Is.EqualTo(1));
    // or alternatively ...
    model.Id.ShouldBe(1);
    

    【讨论】:

    • 是的,已经有人告诉过我了,但是我该如何更改它以使测试成功通过?我将需要使用从数据库中获取的 News 对象填充 NewsEditModel 属性。
    • 希望我的示例将有助于阐明如何检查属性值。如果您从数据库中获取值,您应该考虑是否可以模拟数据库检索代码,以便您只对控制器操作进行单元测试,而不是对数据库层进行单元测试。
    • @RichTea:我不是要验证模型属性。我想说的是,在我的控制器中,我将拥有一个 NewsEditModel。此模型属性将从我从数据库调用中获得的 News 对象填充/映射。然后我将返回 View(newsEditModel);.
    • 如果您不验证模型属性,那么您可以在我的示例中省略最后一行。然后,您的单元测试将只是验证视图是否已呈现,并且该视图的视图数据是正确的类型(NewsEditModel)。
    • 好酷。我刚刚更新了我的编辑。请在我想要完成的事情上达到顶峰。你的答案还是一样吗?我什么时候使用应该?
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多