2015-03-19 57 views
2

我正在使用Nunit单元测试框架和Moq嘲笑我的MVC web应用程序中的对象我有“HttpContext.Current.ApplicationInstance.Response” 在我的行动时,测试包含此代码返回错误, 我已经嘲笑的HttpContext,但我没有约嘲讽applicationInstance.Response请帮我家伙嘲笑HttpContext.Current.ApplicationInstance.Response

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

    public void HttpContextMocking(string requesturl) 
    {HttpMock = new Mock<HttpContextBase>(); 
     var fakeIdentity = new GenericIdentity("[email protected]"); 
     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("[email protected]");} 

我得到错误NUnit的应用程序对象空引用execption,在该代码在我的源码抛出异常时调试抛单元测试

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

+0

什么是错误你越来越? – VictorySaber 2015-03-19 16:11:23

+0

HI @VictorySaber我已更新我的问题中的错误。 – 2015-03-20 05:54:26

+0

你最好的选择是重构你的代码,这样上下文(或者甚至只是你需要的一小部分信息)是一个参数,然后从你没有进行单元测试的东西中传递它。 (您仍然可以进行集成测试。)这将允许您在单元测试期间传递存根。在最好的情况下,你的单元测试可以简化为一个简单的输入/输出测试。 – jpmc26 2015-03-20 05:55:50

回答

0

尝试模拟响应:

var response1 = new Mock<HttpResponseBase>(); 
response1.Setup(p => p.Write(A<string>.Ignored)).Callback((string s) => sb.Append(s)); 
+0

有两种不同的,不相关的'Response'类型。 [HttpContext.Current'使用的](https://msdn.microsoft.com/en-us/library/system.web.httpresponse%28v=vs.110%29.aspx)是密封的,不会继承从'HttpResponseBase'。所以这不适用于OP的用例。 – jpmc26 2015-03-24 20:58:18