在单元测试中无法从QueryStringValueProvider(ControllerContext)获取IValueProvider值吗?

时间:2014-11-03 13:28:01

标签: c# asp.net-mvc asp.net-mvc-4 unit-testing

以下是Test方法为请求和上下文创建模拟 已将查询字符串添加到上下文中,同时调试TestMethod可以查看查询字符串集合的值

    [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            
    }

在使用QueryStringValueProvider获取值但没有namevaluecollection的save方法中 QueryStringValueProvider采用ControllerContext.HttpContext.Request.QueryString来进行调试

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

1 个答案:

答案 0 :(得分:0)

<强>解决方案

这解决了我在提出问题之前我应该​​花一些时间来分析

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;