Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试HttpResponse.StatusCode的结果_C#_Unit Testing_Asp.net Mvc 4 - Fatal编程技术网

C# 测试HttpResponse.StatusCode的结果

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

我已经编写了一个ErrorsController,正如您可以想象的那样,它有非常简单的方法在出现错误时继续提供动态内容,例如500

现在我要做的是测试在该方法中,HttpResponseBase.StatusCode在执行该方法时设置为给定的数字,但由于某些原因,StatusCode属性始终为0。这包括在设置属性后直接检查属性时

控制器

GetViewModel只在视图模型上设置属性

试验


我哪里出错了?

只需在设置阶段添加以下内容:

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;为我工作!谢谢