在为控制器编写单元测试的过程中,我需要设置或初始化 -
ControllerContext.HttpContext.Request.QueryString
设置它的最简单方法是什么,以便我实际上可以通过ControllerContext.HttpContext.Request.QueryString
- 并测试控制器?
在为控制器编写单元测试的过程中,我需要设置或初始化 -
ControllerContext.HttpContext.Request.QueryString
设置它的最简单方法是什么,以便我实际上可以通过ControllerContext.HttpContext.Request.QueryString
- 并测试控制器?
您可以使用模拟框架来模拟控制器正在使用的 HttpContext。
例如NSubstitute
:
// arrange
var contextMock = Substitute.For<HttpContextBase>();
var requestMock = Substitute.For<HttpRequestBase>();
var queryString = new NameValueCollection();
queryString["foo"] = "bar";
requestMock.QueryString.Returns(queryString);
contextMock.Request.Returns(requestMock);
var sut = new SomeController();
sut.ControllerContext = new ControllerContext(contextMock, new RouteData(), sut);
// act
var actual = sut.SomeAction();
// assert
...
当然,您可以使用您喜欢的任何其他模拟框架,例如 Moq 或 Rhino Mocks 来模拟 HttpContext。
顺便说一句,如果您使用视图模型(您应该始终在正确设计的 ASP.NET MVC 应用程序中这样做),您甚至不会关心 Request.QueryString 因为您的控制器操作现在将视图模型作为参数:
public ActionResult SomeAction(MyViewModel model)
{
...
}
并且默认模型绑定器会考虑到请求参数与模型的绑定。您应该避免在控制器操作中编写管道代码,从查询字符串和内容中提取一些数据。
看看您的单元测试现在变得更具可读性:
var model = new MyViewModel();
model.Foo = "bar";
var sut = new SomeController();
// act
var actual = sut.SomeAction(model);
// assert
...
看?您不再需要关心管道代码。