2017-01-06 34 views
0

在我的Asp.net核心1應用程序創建Asp.net核心1請求我有控制器,具有以下方法:如何測試

[Microsoft.AspNetCore.Mvc.HttpPost()] 
[Microsoft.AspNetCore.Mvc.RequireHttps] 
public async System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult> Save() 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      var pass = Request.Form["password"].ToString(); 
      var pass1 = Request.Form["password1"].ToString(); 
      if (!pass.Equals(pass1)) 
      { 
       return View("~/Views/PasswordRecovery.cshtml"); 
      }     
     } 
     catch (System.Exception ex) 
     { 
      return View("~/Views/Message.cshtml"); 
     } 
    } 
    return View("~/Views/Message.cshtml"); 
} 

我想寫這個方法的測試。所以我寫了這個:

[Xunit.Fact] 
public async System.Threading.Tasks.Task SavePassNotEqualTest() 
{ 
    var controller = new Controllers.PasswordRecoveryController(_mockRepo.Object); 
    var dic = new System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues>(); 
    dic.Add("password", "test"); 
    dic.Add("password1", "test1"); 
    var collection = new Microsoft.AspNetCore.Http.FormCollection(dic); 
    controller.Request.Form = collection; //request is null 

    var result = await controller.Save(); 
    var viewResult = Xunit.Assert.IsType<Microsoft.AspNetCore.Mvc.ViewResult>(result); 
    Xunit.Assert.Equal("~/Views/Message.cshtml", viewResult.ViewName); 
} 

的問題是,我需要設置一些測試值表單,表單是請求以及請求爲NULL。我無法找到,我如何創建一些非NULL請求並用值填充它的Form。

編輯 答案幫我用以下解決方案完成了:

我已經創建了一個將返回的FormCollection方法:

private Microsoft.AspNetCore.Http.FormCollection GetFormCollection() 
{ 
    var dic = new System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues>(); 
    dic.Add("password", "test"); 
    dic.Add("password1", "test1"); 
    return new Microsoft.AspNetCore.Http.FormCollection(dic); 
} 

而我的測試方法是:

[Xunit.Fact] 
public async System.Threading.Tasks.Task SavePassNotEqualTest() 
{   
    var controller = new Findufix.Controllers.PasswordRecoveryController(_mockRepo.Object); 

    var httpContext = new Moq.Mock<Microsoft.AspNetCore.Http.HttpContext>(); 
    httpContext.Setup(x => x.Request.Form).Returns(GetFormCollection()); 

    controller.ControllerContext.HttpContext = httpContext.Object;   

    var result = await controller.Save(); 
    var viewResult = Xunit.Assert.IsType<Microsoft.AspNetCore.Mvc.ViewResult>(result); 
    Xunit.Assert.Equal("~/Views/PasswordRecovery.cshtml", viewResult.ViewName); 
} 

回答

3

隨着Moq,你可以這樣做:

var httpContext = new Mock<HttpContextBase>();   

httpContext.Setup(c => c.Request.Form).Returns(delegate() 
{ 
    var formVaues = new NameValueCollection(); 
    formVaues .Add("Id", "123"); 
    formVaues .Add("Name", "Smith"); 

    return formVaues ; 
}); 
2

在起訂量,你可以嘗試使用設置()或SetupGet()教它返回你需要

沿

controller.SetupGet(x => x.Request.Form).Returns(collection); 
2

線的東西的東西,如果你傳遞一個DefaultHttpContext到您的控制器Request將不會爲空,您可以將該表格分配給Request.Form。不需要嘲弄。

[Xunit.Fact] 
public async System.Threading.Tasks.Task SavePassNotEqualTest() 
{ 
    var controller = new Controllers.PasswordRecoveryController(_mockRepo.Object); 
    var dic = new System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues>(); 
    dic.Add("password", "test"); 
    dic.Add("password1", "test1"); 
    var collection = new Microsoft.AspNetCore.Http.FormCollection(dic); 

    // Give the controller an HttpContext. 
    controller.ControllerContext.HttpContext = new DefaultHttpContext(); 
    // Request is not null anymore. 
    controller.Request.Form = collection; 

    var result = await controller.Save(); 
    var viewResult = Xunit.Assert.IsType<Microsoft.AspNetCore.Mvc.ViewResult>(result); 
    Xunit.Assert.Equal("~/Views/Message.cshtml", viewResult.ViewName); 
}