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
Unit testing 模拟HttpContext.Current.ApplicationInstance.Response_Unit Testing_Moq - Fatal编程技术网

Unit testing 模拟HttpContext.Current.ApplicationInstance.Response

Unit testing 模拟HttpContext.Current.ApplicationInstance.Response,unit-testing,moq,Unit Testing,Moq,我使用Nunit单元测试框架和Moq模拟MVC Web应用程序中的对象,我有“HttpContext.Current.ApplicationInstance.Response” 在我的操作中,当测试包含此代码的操作时,它返回错误, 我已经模拟了httpcontext,但我不知道如何模拟applicationInstance。回应请帮助我 public static Mock<HttpContextBase> HttpMock { get; set; } public vo

我使用Nunit单元测试框架和Moq模拟MVC Web应用程序中的对象,我有“HttpContext.Current.ApplicationInstance.Response” 在我的操作中,当测试包含此代码的操作时,它返回错误, 我已经模拟了httpcontext,但我不知道如何模拟applicationInstance。回应请帮助我

 public static Mock<HttpContextBase> HttpMock { get; set; }

    public void HttpContextMocking(string requesturl)
    {HttpMock = new Mock<HttpContextBase>();
        var fakeIdentity = new GenericIdentity("sampe@email.com");
        var principal = new GenericPrincipal(fakeIdentity, null);
        HttpMock.Setup(x => x.User).Returns(principal);
        HttpContext.Current = new HttpContext(new HttpRequest("", requesturl, ""), new HttpResponse(null));
        HttpContext.Current.User = principal;

        //Mocking the Httpcontext User Identity
        HttpMock.SetupGet(c => c.User.Identity.Name).Returns("sampe@email.com");}
publicstaticmock-HttpMock{get;set;}
公共无效HttpContextMocking(字符串请求URL)
{HttpMock=new Mock();
var fakeIdentity=新的GenericEntity(“sampe@email.com");
var principal=新的GenericPrincipal(fakeIdentity,null);
Setup(x=>x.User).Returns(主体);
当前=新的HttpContext(新的HttpRequest(“,requesturl,”),新的HttpResponse(null));
HttpContext.Current.User=主体;
//模拟Httpcontext用户标识
HttpMock.SetupGet(c=>c.User.Identity.Name)。返回(“sampe@email.com");}
我在Nunit应用程序中得到错误作为对象空引用执行选项,在我的源代码中的代码在调试抛出单元测试时抛出异常

“响应在此上下文中不可用。” HttpContext.Current.ApplicationInstance.Response='HttpContext.Current.ApplicationInstance.Response'引发了类型为'System.Web.HttpException'的异常。

尝试模拟响应:

var response1 = new Mock<HttpResponseBase>();
response1.Setup(p => p.Write(A<string>.Ignored)).Callback((string s) => sb.Append(s));
var response1=newmock();
response1.Setup(p=>p.Write(A.Ignored)).Callback((字符串s)=>sb.Append(s));

您遇到的错误是什么?您好@VictorySaber我已经更新了我问题中的错误。您最好的选择是重构代码,使上下文(甚至只是您需要的一小部分信息)成为一个参数,然后从您不进行单元测试的内容中传递它。(您仍然可以对其进行集成测试。)这将允许您在单元测试期间传入存根。在最好的情况下,您的单元测试将简化为一个简单的输入/输出测试。我无法修改我的源代码,也无法修改任何其他模拟httpContext.Current.Application的解决方案?对,因此您不应该对其进行单元测试。单元测试是在开发过程中完成的任务。它的最终目标是通过帮助您在进行更改时发现错误来提高可靠性,并通过将您推向更简单的系统来提高可维护性。当然,单元测试并不是神奇地完成这两项任务的灵丹妙药;要想获得这些好处,还需要实践、技能、认真思考和理解。但是如果你不修改你正在测试的代码,你肯定得不到它们。下一次更改代码时,应该考虑添加测试;以前没有。有两种不同的、不相关的
响应类型。是密封的,不从HttpResponseBase继承。所以这对OP的用例不起作用。