ControllerContext.用于单元测试的HttpContext初始化
本文关键字:HttpContext 初始化 单元测试 用于 ControllerContext | 更新日期: 2023-09-27 18:07:58
在为控制器编写单元测试的过程中,我需要设置或初始化-
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 mock来模拟HttpContext。
顺便说一下,如果你使用视图模型(你应该总是在一个适当设计的ASP. js中这样做)。. NET MVC应用程序),你甚至不会关心请求。QueryString,因为你的控制器动作现在已经将视图模型作为参数:
public ActionResult SomeAction(MyViewModel model)
{
...
}
和默认的模型绑定器将考虑到请求参数到模型的绑定。你应该避免在你的控制器操作中编写管道代码,在那里你从查询字符串和东西中提取一些数据。
看看你的单元测试现在变得多么可读:
var model = new MyViewModel();
model.Foo = "bar";
var sut = new SomeController();
// act
var actual = sut.SomeAction(model);
// assert
...
看到了?你不需要再关心管道代码了。