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();
}
}
你不应该这样做,这样的控制器不应该存在。控制器上下文尚未在构造函数中初始化,它不仅在单元测试中会失败,而且在实际测试中也会失败
您应该使用可以访问请求上下文的方法。您解决过这个问题吗?我也有同样的问题你解决过这个问题吗?我刚才也有同样的问题为什么不把这个标记为答案?我遇到了一个类似的问题,我需要访问请求上下文,而这个解决方案比我希望的要好。为什么不将其标记为答案?我有一个类似的问题,我需要访问请求上下文,这个解决方案比我希望的要好。