如何获得传递给RedirectToAction进行单元测试的模型?

时间:2016-11-07 08:36:12

标签: c# asp.net-mvc unit-testing

我有一个带有以下return语句的ASP.NET MVC 5控制器:

return RedirectToAction("SendEmail",message);

其中message是Message类型的对象。我想单元测试这个控制器是否适当地返回了消息对象,而不仅仅是它返回到SendEmail动作(我已经成功地写了那个测试)。

如何检查控制器是否正确地将Message对象作为RedirectToAction的参数返回?我无法通过简单的尝试来实现:

 var result = controller.Save(mockMessage) as RedirectToRouteResult;

 //Assert
 Assert.IsInstanceOf<Message>(result.RouteValues);

我熟悉RouteValues [&#34; action&#34;]和RouteValues [&#34; controller&#34;]但我不知道如何检查模型,result.RouteValues [&#34; model&#34;]不会那样工作。

完整控制器代码:

 public ActionResult Save([Bind(Exclude = "Id")] Message message)
 {

     if (!ModelState.IsValid)
     {
         var viewModel = new MessageViewModel(message);
         return View("index",viewModel);
     }

     message.TimeStamp = DateTime.UtcNow;
     _messageRepository.Add(message);
     return RedirectToAction("SendEmail",message);
 }

1 个答案:

答案 0 :(得分:1)

如果您想使用Moq Framework,您可以在控制器类中定义一个调用base.RedirectToAction的虚拟方法

public virtual RedirectToRouteResult RedirectToAction(string actionName, Message message)
    {
        return base.RedirectToAction(actionName, message);
    }

这可能是您的测试代码:

[Test]
    public void it_should_do()
    {
        var myController = new Mock<MyController> { CallBase = true };
        myController.Save(myMessage);

        myController.Verify(m => m.RedirectToRouteResult(It.IsAny<string>(), It.IsAny<Message>()), Times.Once);
        myController.Verify(m => m.RedirectToRouteResult("SendEmail", myMessage), Times.Once);
    }

但是,这有一个公共虚方法的缺点,但您可以测试是否采用了Message对象。