如何获得传递给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);
}
如果你喜欢使用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对象是否被占用。