2016-11-07 33 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對象是否被採用。