【问题标题】:simple testing ViewResult and mocking Model used in controller控制器中使用的简单测试 ViewResult 和模拟模型
【发布时间】:2016-10-16 09:32:32
【问题描述】:

在控制器内部,我有一个视图,它将简单对象返回给视图。

public ActionResult SomeAction(int?id)
{
   MyModel model = new MyModel();
   return View(model);
}

我如何对这个控制器进行单元测试以检查 ViewResult, 基本上是

检查视图是否已初始化?基本上我怎么能模拟这个 MyModel 在我的单元测试中?

    [Test]
    public void Can_Open_SomeAction()
    {
        // controller is already set inside `SetUp` unit step.
        ViewResult res = this.controller.SomeAction() as ViewResult;
        Assert.IsNotNull(res);
    }

更新:

 public ActionResult SomeAction(int?id)
 {
      MyModel model = new MyModel();
      this.PopulatePageCombos(id);
      return View(model);
 }

【问题讨论】:

  • Assert.IsNotNull(res.Model as MyModel); 如果您要检查的模型已传递给视图。
  • 是否需要检查视图是否已初始化?您基本上是在测试 MVC 引擎是否正常工作,而不是专注于您自己的代码。您可以放心地假设视图在那里,模型已通过。如果您抽象代码并应用适当的 SOC,那么您可以测试您应该测试的内容,这是您自己的功能。

标签: asp.net-mvc unit-testing nunit moq


【解决方案1】:

您设置它的方式,我想您只是想查看模型是否不为空:

[Test]
public void Can_Open_SomeAction()
{
    ViewResult res = this.controller.SomeAction() as ViewResult;
    Assert.IsNotNull(res);
    var model = result.Model as MyModel;
    Assert.IsNotNull(model);
}

只有在您从底层接口获取模型的上下文中,模拟才有意义,例如,如果您有:

public ActionResult SomeAction(int?id)
{
   MyModel model = _myModelQuerier.Fetch(id.Value);
   return View(model);
}

那么你可以绕过类似的东西

var modelQuerierMock = MockRepository.GenerateMock<IMyModelQuerier>();
modelQuerierMock.Stub(x => x.Fetch(Arg<int>.Is.Anything)).Return(new MyModel(2, "product"));

在你的测试类中

【讨论】:

  • 你的第一个解决方案工作正常,我用填充页面组合更新了问题,现在测试在那条线上失败。我应该将此作为新问题发布吗?
猜你喜欢
  • 2014-06-02
  • 2013-08-04
  • 2023-03-11
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2012-02-27
  • 2014-07-30
  • 2011-05-30
相关资源
最近更新 更多