C# 测试HttpResponse.StatusCode的结果
我已经编写了一个ErrorsController,正如您可以想象的那样,它有非常简单的方法在出现错误时继续提供动态内容,例如500 现在我要做的是测试在该方法中,HttpResponseBase.StatusCode在执行该方法时设置为给定的数字,但由于某些原因,StatusCode属性始终为0。这包括在设置属性后直接检查属性时 控制器 GetViewModel只在视图模型上设置属性 试验C# 测试HttpResponse.StatusCode的结果,c#,unit-testing,asp.net-mvc-4,C#,Unit Testing,Asp.net Mvc 4,我已经编写了一个ErrorsController,正如您可以想象的那样,它有非常简单的方法在出现错误时继续提供动态内容,例如500 现在我要做的是测试在该方法中,HttpResponseBase.StatusCode在执行该方法时设置为给定的数字,但由于某些原因,StatusCode属性始终为0。这包括在设置属性后直接检查属性时 控制器 GetViewModel只在视图模型上设置属性 试验 我哪里出错了?只需在设置阶段添加以下内容: httpResponse.SetupAllProperties
我哪里出错了?只需在设置阶段添加以下内容:
httpResponse.SetupAllProperties();
话虽如此,您可能不需要这两种断言:
this.httpResponse.VerifySet(x => x.StatusCode = (int)HttpStatusCode.NotFound);
Assert.AreEqual((int)HttpStatusCode.NotFound, this.httpResponse.StatusCode);
第一个应该足以进行单元测试。只需在设置阶段添加以下内容:
httpResponse.SetupAllProperties();
话虽如此,您可能不需要这两种断言:
this.httpResponse.VerifySet(x => x.StatusCode = (int)HttpStatusCode.NotFound);
Assert.AreEqual((int)HttpStatusCode.NotFound, this.httpResponse.StatusCode);
第一种方法对于您的单元测试应该已经足够了。我最后使用了一种模拟HttpContext的扩展方法
public static class HttpContextExtensions
{
public static void MockHttpContext(this Controller controller)
{
var httpContextMock = new Mock<HttpContextBase>();
var requestMock = new Mock<HttpRequestBase>();
var responseMock = new Mock<HttpResponseBase>();
responseMock.SetupAllProperties();
requestMock.SetupAllProperties();
httpContextMock.Setup(x => x.Response).Returns(responseMock.Object);
httpContextMock.Setup(x => x.Request).Returns(requestMock.Object);
controller.ControllerContext = new ControllerContext();
controller.ControllerContext.HttpContext = httpContextMock.Object;
}
}
我最终得到了一个模拟HttpContext的扩展方法
public static class HttpContextExtensions
{
public static void MockHttpContext(this Controller controller)
{
var httpContextMock = new Mock<HttpContextBase>();
var requestMock = new Mock<HttpRequestBase>();
var responseMock = new Mock<HttpResponseBase>();
responseMock.SetupAllProperties();
requestMock.SetupAllProperties();
httpContextMock.Setup(x => x.Response).Returns(responseMock.Object);
httpContextMock.Setup(x => x.Request).Returns(requestMock.Object);
controller.ControllerContext = new ControllerContext();
controller.ControllerContext.HttpContext = httpContextMock.Object;
}
}
@尼古拉·艾丹特,你能详细说明一下吗?我只是刚刚开始使用Testing,通过在手动实例化的控制器上调用一个方法,您绕过了整个HTTP堆栈。您的控制器上下文、HTTP上下文和HTTP响应未被使用,您必须检查控制器返回的ViewResult。@CodeMaster不能为true。在模拟响应/上下文之前。我会在方法中得到一个null错误,声明响应为null。我还可以通过调试看出,响应是我的模拟对象,很容易出错that@jumpingcode我被纠正了,你确实在新的Mockthis.requestContext,this.controller中连接了整个shebang。@CodeCaster Phew,我是panicking@NikolaiDante你能详细说明一下吗?我只是刚刚开始使用Testing,通过在手动实例化的控制器上调用一个方法,您绕过了整个HTTP堆栈。您的控制器上下文、HTTP上下文和HTTP响应未被使用,您必须检查控制器返回的ViewResult。@CodeMaster不能为true。在模拟响应/上下文之前。我会在方法中得到一个null错误,声明响应为null。我还可以通过调试看出,响应是我的模拟对象,很容易出错that@jumpingcode我纠正了,你确实在新的Mockthis.requestContext,this.controller中连接了整个shebang。@CodeCaster Phew,我很恐慌,非常感谢!工作perfectly@NikolaiDante,不,试跑者不重要。您可能忘了正确模拟HttpContext。@DarinDimitrov我没有询问测试运行者:@jumpingcode,对不起,这是为NikolaiDante准备的:-@DarinDimitrov设置httpResponse.SetupAllProperties;为我工作!谢谢非常感谢你!工作perfectly@NikolaiDante,不,试跑者不重要。您可能忘了正确模拟HttpContext。@DarinDimitrov我没有询问测试运行者:@jumpingcode,对不起,这是为NikolaiDante准备的:-@DarinDimitrov设置httpResponse.SetupAllProperties;为我工作!谢谢