gpt4 book ai didi

c# - 用于单元测试的 ControllerContext.HttpContext 初始化

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:44 26 4
gpt4 key购买 nike

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

ControllerContext.HttpContext.Request.QueryString

最简单的设置方法是什么,以便我可以实际传递 - ControllerContext.HttpContext.Request.QueryString - 并测试 Controller ?

最佳答案

您可以使用模拟框架来模拟 Controller 正在使用的 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。

顺便说一句,如果您使用 View 模型(在设计合理的 ASP.NET MVC 应用程序中您应该始终这样做),您甚至不会关心 Request.QueryString,因为您的 Controller 操作现在已经将 View 模型作为参数:

public ActionResult SomeAction(MyViewModel model)
{
...
}

默认的模型绑定(bind)器会考虑到请求参数与模型的绑定(bind)。您应该避免在从查询字符串和内容中提取一些数据的 Controller 操作中编写管道代码。

看看您的单元测试现在变得更加可读了:

var model = new MyViewModel();
model.Foo = "bar";
var sut = new SomeController();

// act
var actual = sut.SomeAction(model);

// assert
...

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

关于c# - 用于单元测试的 ControllerContext.HttpContext 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15882372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com