2011-08-19 70 views
0

我正在使用NUnit和NSubstitute对使用HttpResponse的函数进行一些单元测试,我知道你不能模拟这些对象,所以我创建了接口来表示它们以及其中的一些属性。Response.Cache.VaryByHeader上的Nunit测试

我无法理解如何创建一个接口,用于Response.Cache.VaryByHeader

// This is my HttpResponse interface 
public interface IHttpResponse 
{ 
    Stream Filter { get ; set; } 
    IHttpCachePolicy Cache { get; set; } 
    void AppendHeader(string name, string value); 
} 

// concrete httresponse 
public class HttpResponseProxy : IHttpResponse 
{ 
    private HttpResponse _httpResponse; 

    public Stream Filter { 
     get { 
      return _httpResponse.Filter ?? new MemoryStream(); 
     } 
     set { _httpResponse.Filter = value; } 
    } 

    public IHttpCachePolicy Cache 
    { 
     get { return new HttpCachePolicyProxy(_httpResponse.Cache); } 
     set { } 
    } 

    public HttpResponseProxy(HttpResponse httpResponse) 
    { 
     if (httpResponse == null) 
     { 
      throw new ArgumentNullException("httpResponse"); 
     } 

     _httpResponse = httpResponse; 
     _httpResponse.Filter = httpResponse.Filter; 
    } 

    public void AppendHeader(string name, string value) 
    { 
     _httpResponse.AppendHeader(name, value); 
    } 
}  

// HttpCachePolicy interface 
public interface IHttpCachePolicy 
{ 
    IHttpCacheVaryByHeaders VaryByHeaders { get; set; } 
} 

// concrete HttpCachePolicy 
public class HttpCachePolicyProxy : IHttpCachePolicy 
{ 
    private HttpCachePolicy _httpCachePolicy; 
    public HttpCachePolicyProxy(HttpCachePolicy httpCachePolicy) 
    { 
     _httpCachePolicy = httpCachePolicy; 
    } 

    public IHttpCacheVaryByHeaders VaryByHeaders 
    { 
     get { return new HttpCacheVaryByHeadersProxy(_httpCachePolicy.VaryByHeaders as HttpCacheVaryByHeaders); } 
     set { } 
    } 
} 


public interface IHttpCacheVaryByHeaders 
{ 
    IHttpCacheVaryByHeaders HttpCacheVaryByHeaders { get; set; } 
} 

public class HttpCacheVaryByHeadersProxy : IHttpCacheVaryByHeaders 
{ 
    private HttpCacheVaryByHeaders _httpCacheVaryByHeaders; 
    public HttpCacheVaryByHeadersProxy(HttpCacheVaryByHeaders httpCacheVaryByHeaders) 
    { 
     _httpCacheVaryByHeaders = httpCacheVaryByHeaders; 
    } 

    public IHttpCacheVaryByHeaders HttpCacheVaryByHeaders 
    { 
     get { return new HttpCacheVaryByHeadersProxy(_httpCacheVaryByHeaders); } 
     set { } 
    } 
} 

我这是在实际测试功能:

public static void CompressPage(IHttpRequestGetCompressionMode getCompressionMode, IHttpResponse httpResponse) 
    { 
     string supportedCompression = getCompressionMode.GetClientSupportedCompressionMode(); 
     if (supportedCompression != HttpHeaderValues.NoCompression) 
     { 
      switch (supportedCompression) 
      { 
       case HttpHeaderValues.DeflateCompression: 
        httpResponse.Filter = new DeflateStream(httpResponse.Filter, CompressionMode.Compress); 
        break; 
       case HttpHeaderValues.GZipCompression: 
        httpResponse.Filter = new GZipStream(httpResponse.Filter, CompressionMode.Compress); 
        break; 
      } 

      httpResponse.AppendHeader(HttpHeaderValues.ContentEncodingHeader, supportedCompression); 
      // this line is where i have the problem 
      httpResponse.Cache.VaryByHeaders[HttpHeaderValues.AcceptEncodingHeader] = true; 
     } 
    } 

我收到“不能将索引应用于IHttpCacheVaryByHeaders类型的表达式“错误。 我有响应和缓存的接口,但是如何在接口中表示VaryByHeaders,然后在具体的类中使用它?

回答

0

错误似乎表明,IHttpCacheVaryByHeaders没有一个索引声明(例如bool this[string header] { get; set; }),而是比你实现这些包装,尝试HttpResponseWrapperSystem.Web.Abstractions。这将会使测试这件事更容易。 :)

+0

嗨大卫非常感谢你,我使用bool这[string header] {get;组; }现在修复我的测试,但会看到抽象,当我有机会,我不知道如何布尔这[string header] {get;组; }的作品,但我会研究它。干杯。 – Dave