2016-11-07 35 views
1

我有一个ASP.NET MVC 5控制器用下面return语句:如何获取传递给RedirectToAction进行单元测试的模型?

return RedirectToAction("SendEmail",message); 

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

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

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

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

我熟悉RouteValues [“行动”]和RouteValues [“控制器”],但我不知道如何来检查模型,结果。 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); 
} 
+1

“RedirectToAction”的第二个参数在内部转换为“RouteValueDictionary”。它接受'object'的唯一原因是让你以一种方便的'new {k = v}'格式定义路由选择值。我不认为你的'Message'可以转换为'RouteValueDictionary',它最终会成为一个'RouteValueDictionary',它对应于'Message'的属性名和值。 – haim770

+1

Save方法是POST请求吗?因为RedirectToAction会产生一个GET请求。 –

+0

@AndriyTolstoy是的。谢谢你的指示。 –

回答

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对象是否被采用。