gpt4 book ai didi

c# - 如何模拟或伪造 HttpApplication/HttpContext 进行测试

转载 作者:太空狗 更新时间:2023-10-29 17:58:16 37 4
gpt4 key购买 nike

我正尝试在我的 MVC 应用程序上运行一些测试,但我一直在努力让它工作。我会尽量开门见山:

我正在使用 RhinoMocks 来尝试这样的事情:

设置:

MockRepository mocks = new MockRepository();
HttpContextBase _mockContext = mocks.FakeHttpContext();
mocks.SetFakeControllerContext(new LoginController());
HttpApplicationStateBase appState = MockRepository.GenerateStub<HttpApplicationStateBase>();
_mockContext.Expect(mc => mc.Application).Return(appState);
HttpContext.Current = _mockContext.ApplicationInstance.Context;

这是 FakeHttpContext() 方法:

public static HttpContextBase FakeHttpContext(this MockRepository mocks)
{
HttpApplication app = mocks.PartialMock<HttpApplication>();

HttpContextBase context = mocks.PartialMock<HttpContextBase>();
HttpRequestBase request = mocks.PartialMock<HttpRequestBase>();
HttpResponseBase response = mocks.PartialMock<HttpResponseBase>();
HttpSessionStateBase session = mocks.PartialMock<HttpSessionStateBase>();
HttpServerUtilityBase server = mocks.PartialMock<HttpServerUtilityBase>();

SetupResult.For(context.ApplicationInstance).Return(app);

SetupResult.For(context.Request).Return(request);
SetupResult.For(context.Response).Return(response);
SetupResult.For(context.Session).Return(session);
SetupResult.For(context.Server).Return(server);

mocks.Replay(context);
return context;
}

我真的需要访问 HttpContextBase.Request.AppRelativeCurrentExecutionFilePath 但它总是返回为 nullHttpContext.Current.Request.RequestContext 也是如此。

有人可以帮我吗?可以肯定地说,我现在很绝望。

最佳答案

首先,尽量避免使用 HttpContext.Current,因为使用静态方法会使测试变得更加困难,正如您现在发现的那样。如果您使用的是依赖项注入(inject)框架,请将 HttpContextBase 注入(inject)您的构造函数。

针对你的实际问题,在FakeHttpContext()中尝试改

 HttpRequestBase request = mocks.PartialMock<HttpRequestBase>();

 HttpRequestBase request = mocks.GenerateStub<HttpRequestBase>();

然后在你的测试中你可以做这样的事情:

_mockContext.Request.Stub(x=> x.AppRelativeCurrentExecutionFilePath).Return("foo");
var result = object.DoSomething();
Assert.AreEqual("foo",result);

我认为对 HttpContext 进行部分模拟不是很有用,因为您将测试框架(即测试框架是否根据 HttpContext 中的值 Y 和 Z 返回正确的值 X)

另一种方法是围绕 HttpContextBase 创建一个包装器类,它将返回计算值。例如。 HttpContextBaseWrapper.AppRelativeCurrentExecutionFilePath()HttpContextBaseWrapper.RequestIpAddress()。这将使测试所有其他类变得不那么复杂,因为它们不必担心模拟 HttpContextBase 和细节,它们只需要模拟您的 HttpContextBaseWrapper 类。

编辑:

我还建议您也注入(inject) HttpRequestContext,但如果这不可能,那么您可以像这样在 FakeHttpContext 方法中 stub RequestContext:

var requestContext = MockRepository.GenerateStub<RequestContext>();
request.RequestContext = requestContext;

关于c# - 如何模拟或伪造 HttpApplication/HttpContext 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575893/

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