Gil*_*lla 1 c# unit-testing controller asp.net-mvc-3
在为Controller编写单元测试的过程中,我需要设置或初始化 -
ControllerContext.HttpContext.Request.QueryString
Run Code Online (Sandbox Code Playgroud)
设置它的最简单方法是什么,以便我可以实际通过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
...
Run Code Online (Sandbox Code Playgroud)
当然你可以使用任何其他你喜欢的模拟框架,如Moq或Rhino Mocks来模拟HttpContext.
顺便说一句,如果您使用视图模型(您应该总是在正确设计的ASP.NET MVC应用程序中执行),您甚至不关心Request.QueryString,因为您的控制器操作现在将视图模型作为参数:
public ActionResult SomeAction(MyViewModel model)
{
...
}
Run Code Online (Sandbox Code Playgroud)
并且默认模型绑定器会考虑请求参数与模型的绑定.您应该避免在控制器操作中编写管道代码,您将从查询字符串和内容中提取一些数据.
看看您的单元测试现在变得多可读:
var model = new MyViewModel();
model.Foo = "bar";
var sut = new SomeController();
// act
var actual = sut.SomeAction(model);
// assert
...
Run Code Online (Sandbox Code Playgroud)
看到?您不再需要关心管道代码了.
| 归档时间: |
|
| 查看次数: |
2814 次 |
| 最近记录: |