【问题标题】:How to mock viewModel when test controller?测试控制器时如何模拟viewModel?
【发布时间】:2018-12-01 01:25:09
【问题描述】:

我必须如下测试我的控制器

[HttpGet]
[Route("")]
[HandleError(View= "Error")]
public ActionResult Index(string name)
{
    return View("Index", new MyViewModel){
    Name = name,
    Link = Request.UrlReferrer
   }
}

我的 ViewModel 如下

public class MyViewModel{
    public string Name{get;set;}
    public Uri Link{get;set}
}

我的问题是,当我编写如下单元测试时,controller.Index(name) 总是返回 null,似乎是因为我没有模拟 ViewModel?但是我如何模拟函数内部的 ViewModel 呢?

我的目的是测试名称是否正确传递到 ViewModel,我认为我不应该模拟 MyViewModel,对吗?

另外,因为这是 HttpGet,我应该模拟 Http 请求吗?我不确定如何在 MVC.NET 中测试 Http 请求

[TestMethod]
public void Index_Return_ViewModel(){
    string name = "name";
    var controller = new MyController(foo, bar);

    var result = controller.Index(name) as ViewResult;
    var viewModel = controller.ViewData.Model as MyViewModel;

    Assert.AreEqual("Index", result.ViewName);
}

【问题讨论】:

  • 被测方法中的代码不准确。可能是笔误。请修复。

标签: c# asp.net unit-testing model-view-controller identityserver3


【解决方案1】:

使用以下示例控制器

public class MyController : Controller {

    [HandleError(View = "Error")]
    public ActionResult Index(string name) {
        return View("Index", new MyViewModel() {
            Name = name,
            Link = Request.UrlReferrer
        });
    }
}

为了解释答案。

由于该操作访问Request.UrlReferrer,因此单元测试需要提供必要的依赖项,以完成测试。

例如

[TestMethod]
public void Index_Return_ViewModel() {
    //Arrange
    var link = new Uri("http://example.com");
    var mockContext = new Mock<ControllerContext>();
    mockContext.Setup(_ => _.HttpContext.Request.UrlReferrer)
        .Returns(link);
    string name = "name";
    var controller = new MyController() {
        ControllerContext = mockContext.Object
    };

    //Act
    var result = controller.Index(name) as ViewResult;

    //Assert
    Assert.AreEqual("Index", result.ViewName);
    var viewModel = controller.ViewData.Model as MyViewModel;
    Assert.IsNotNull(viewModel);
    Assert.AreEqual(name, viewModel.Name);
    Assert.AreEqual(link, viewModel.Link);
}

没有必要模拟视图模型。通过将返回的模型属性与预期值进行比较,可以确认操作是否符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多