Asp.net mvc 通过模拟框架填充查询字符串时出现Null异常

Asp.net mvc 通过模拟框架填充查询字符串时出现Null异常,asp.net-mvc,unit-testing,constructor,mocking,query-string,Asp.net Mvc,Unit Testing,Constructor,Mocking,Query String,有一个简单的控制器,在它的构造函数中读取查询字符串 public class ProductController : Controller { parivate string productName; public ProductController() { productName = Request.QueryString["productname"]; } public ActionResult Index() {

有一个简单的控制器,在它的构造函数中读取查询字符串

 public class ProductController : Controller
 {
    parivate string productName;

    public ProductController()
    {
       productName = Request.QueryString["productname"];
    }

    public ActionResult Index()
    {
        ViewData["Message"] = productName;

        return View();
    }
 }
另外,我在单元测试中有一个函数,它创建了这个控制器的一个实例,我用一个模拟对象填充查询字符串,如下所示

[TestClass]
public class ProductControllerTest
{
    [TestMethod]
    public void test()
    {
        // Arrange 
        var querystring = new System.Collections.Specialized.NameValueCollection { { "productname", "sampleproduct"} };
        var mock = new Mock<ControllerContext>();
        mock.SetupGet(p => p.HttpContext.Request.QueryString).Returns(querystring);

        var controller = new ProductController();
        controller.ControllerContext = mock.Object;

        // Act
        var result = controller.Index() as ViewResult;


        // Assert
        Assert.AreEqual("Index", result.ViewName);
    }
}
[TestClass]
公共类ProductControllerTest
{
[测试方法]
公开无效测试()
{
//安排
var querystring=new System.Collections.Specialized.NameValueCollection{{{“productname”,“sampleproduct”};
var mock=new mock();
SetupGet(p=>p.HttpContext.Request.QueryString).Returns(QueryString);
var controller=new ProductController();
controller.ControllerContext=mock.Object;
//表演
var result=controller.Index()作为ViewResult;
//断言
Assert.AreEqual(“Index”,result.ViewName);
}
}
很遗憾,当我运行测试单元时,ProductController的构造函数中的Request.QueryString[“productname”]为空

有没有办法通过模拟填充querystrin并将其放入控件的构造函数中

有一个简单的控制器,在它的构造函数中读取查询字符串

 public class ProductController : Controller
 {
    parivate string productName;

    public ProductController()
    {
       productName = Request.QueryString["productname"];
    }

    public ActionResult Index()
    {
        ViewData["Message"] = productName;

        return View();
    }
 }
你不应该这样做,这样的控制器不应该存在。控制器上下文尚未在构造函数中初始化,它不仅在单元测试中会失败,而且在实际测试中也会失败

您应该使用可以访问请求上下文的方法

有一个简单的控制器,在它的构造函数中读取查询字符串

 public class ProductController : Controller
 {
    parivate string productName;

    public ProductController()
    {
       productName = Request.QueryString["productname"];
    }

    public ActionResult Index()
    {
        ViewData["Message"] = productName;

        return View();
    }
 }
你不应该这样做,这样的控制器不应该存在。控制器上下文尚未在构造函数中初始化,它不仅在单元测试中会失败,而且在实际测试中也会失败


您应该使用可以访问请求上下文的方法。

您解决过这个问题吗?我也有同样的问题你解决过这个问题吗?我刚才也有同样的问题为什么不把这个标记为答案?我遇到了一个类似的问题,我需要访问请求上下文,而这个解决方案比我希望的要好。为什么不将其标记为答案?我有一个类似的问题,我需要访问请求上下文,这个解决方案比我希望的要好。