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

本文关键字:单元测试 模型 RedirectToAction 何获得 | 更新日期: 2023-09-27 18:16:48

我有一个ASP。. NET MVC 5控制器使用以下返回语句:

return RedirectToAction("SendEmail",message);

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

我如何检查控制器是否正确返回消息对象作为RedirectToAction的参数?我无法通过简单的尝试了解它:

 var result = controller.Save(mockMessage) as RedirectToRouteResult;
 //Assert
 Assert.IsInstanceOf<Message>(result.RouteValues);

我熟悉RouteValues["action"]和RouteValues["controller"],但我不知道如何检查模型,结果。RouteValues["model"]不是这样的。

完整控制器代码:

 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);
 }

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

如果你喜欢使用Moq框架,你可以在你的控制器类中定义一个调用基类的虚拟方法。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对象是否被占用。