我有一个带有以下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);
}
答案 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对象。