简体   繁体   中英

Can't get IValueProvider values from QueryStringValueProvider(ControllerContext) in Unit Testing?

Here is the Test method Creating a mock for request and context have added the querystring to the context and while debugging the TestMethod could able to see the values of the querystring collection

    [TestMethod]
    public void Save_Tester()
    {
        //Arrange                         
        HomeController controller = new HomeController();

        string querystring = "?key1=value1&key2=value2&key3=value3&key4=value4";

        Mock<HttpRequestBase> mock_request = MockHelpers.CreateMockRequest(querystring);
        Mock<HttpContextBase> mock_context = new Mock<HttpContextBase>();

        //Request
        NameValueCollection myValues = new NameValueCollection();            
        FormCollection formcollection = new FormCollection(myValues);
        mock_request.SetupGet(mr => mr.Params).Returns(myValues);
        mock_request.SetupGet(mr => mr.Form).Returns(myValues);
        mock_request.SetupGet(mr => mr.QueryString).Returns(HttpUtility.ParseQueryString(querystring));

        //Context            
        mock_context.Setup(c => c.Request).Returns(mock_request.Object);
        controller.ValueProvider = formcollection.ToValueProvider();

        // Act                                              
        Assert.IsNotNull(controller); //Guard
        var result_query = controller.Save() as ViewResult;

        // Assert            
    }

In the save method using QueryStringValueProvider to get the Values but has no namevaluecollection QueryStringValueProvider takes the ControllerContext.HttpContext.Request.QueryString that to avail in debugging

[HttpPost]
public ActionResult Save()
{
  try
  {                
   IValueProvider provider = new QueryStringValueProvider(this.ControllerContext);
   //provider has no namevaluecollection values
  }
  catch 
  {
   throw;
  }
}

Solution

This solved it I should have taken some time to analyse before putting a question

Uri uri = new Uri("http://localhost?key1=value1&key2=value2&key3=value3&&key4=value4");

HttpRequest httpRequest = new HttpRequest(string.Empty, uri.ToString(),
                                            uri.Query.TrimStart('?'));

HttpContext httpContext = new HttpContext(httpRequest, new HttpResponse(new StringWriter()));

HttpSessionStateContainer sessionContainer = new HttpSessionStateContainer("id",
                                        new SessionStateItemCollection(),
                                        new HttpStaticObjectsCollection(),
                                        10, true, HttpCookieMode.AutoDetect,
                                        SessionStateMode.InProc, false);

SessionStateUtility.AddHttpSessionStateToContext(
                                             httpContext, sessionContainer);


HttpContext.Current = httpContext; 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM