1

在为控制器编写单元测试的过程中,我需要设置或初始化 -

ControllerContext.HttpContext.Request.QueryString

设置它的最简单方法是什么,以便我实际上可以通过ControllerContext.HttpContext.Request.QueryString- 并测试控制器?

4

1 回答 1

7

您可以使用模拟框架来模拟控制器正在使用的 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
...

看?您不再需要关心管道代码。

于 2013-04-08T14:58:03.817 回答