iT邦幫忙

0

[UnitTest] 如何測試 ASP.NET controller回傳正確的viewModel 而且pass 正確的參數給viewModel?

我目前遇到的問題是,我們使用IdentityServer3 然後其中我們部分的code,像是ForgotPassword需要自己寫,我們就有幾個Controller,所以目前要幫那些Controller寫單元測試,但是我不熟MVC。我看到一個Controller 裡面有好幾個Functions, 都叫做Index(),但是HTTP的方法不同,回傳的View也不同。其中一個像是HttpGet這樣的,如果我要寫unit test不知道要怎麼測.....
我想要可以測他的邏輯,例如name是有值得時候,應該要傳入正確的值給ViewModel,但是這樣子是不是也是要測試ViewModel,要實際把值從MyViewModel裡面拿出來比對?
另外,因為我有用到Request的值,那這樣我是不是要Mock HTTP Request?

public class MyController: Controller{
    [HttpGet]
    [Route("")]
    [HandleError(View= "Error")]
    public ActionResult Index(string name)
    {
      if(string.IsNullOrWhiteSpace(name)){
        name = new LastCookie(Request.GetOwinContext).GetValue();
        }
        return View("Index", new MyViewModel){
        Name = name,
        Link = Request.UrlReferrer
       }
    }
}
public class MyViewModel{
    public string Name{get;set;}
    public Uri Link{get;set}
}
[TestMethod]
public void Index_Return_ViewModel(){
    string name = "name";
    var controller = new MyController(foo, bar);

    var result = controller.Index(name) as ViewResult;
    var viewModel = controller.ViewData.Model as MyViewModel;

    Assert.AreEqual("Index", result.ViewName);
}
小魚 iT邦高手 1 級 ‧ 2018-06-22 00:59:14 檢舉
前端應該會顯示值吧?
還需要另外拿出來比對嗎?
石頭 iT邦研究生 3 級 ‧ 2018-06-22 05:00:00 檢舉
> 因為我有用到Request的值,那這樣我是不是要Mock HTTP Request?

簡單來說:是

但你只可以Mock你使用到的`Request`屬性就好

尚未有邦友回答

立即登入回答