簡體   English   中英

如何在Asp.net Core 1中創建請求進行測試

[英]How to create request in Asp.net core 1 for testing

在我的Asp.net core 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);
}

問題是我需要將一些測試值設置為Form,Form在Request中,而Request為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);
}

使用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 ;
});

如果將DefaultHttpContext傳遞給控制器​​,則Request不會為null,您可以將表單分配給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);
}

在Moq中,您可以嘗試使用Setup()或SetupGet()來教它返回所需的內容

類似於

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM