2011-08-19 79 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