2011-08-19 3 views
0

HttpResponse를 사용하는 함수에서 NUnit 및 NSubstitute를 사용하여 단위 테스트를하고 있습니다. 이러한 객체를 모의 할 수 없으므로이 객체를 대표 할 수있는 인터페이스를 만들었 기 때문에 일부 속성을 나타냅니다. .Response.Cache.VaryByHeader에 대한 Nunit 테스트

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; 
     } 
    } 

내가 "수 없습니다 받고 있어요 : 나는 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 { } 
    } 
} 

이있는 인터페이스를 만드는 방법을 이해하는 데 문제가

내가 실제로 테스트입니다 기능입니다 IHttpCacheVaryByHeaders "오류의 식에 색인을 적용하십시오. 응답 및 캐시를위한 인터페이스가 있지만 인터페이스에서 VaryByHeaders를 어떻게 표현하고 구체적인 클래스에서 사용합니까?

답변

0

오류는 IHttpCacheVaryByHeaders가 인덱서 선언 (예를 들어, bool this[string header] { get; set; })를하지 않는 것이 좋습니다 보인다, 그러나 오히려 이러한 래퍼를 직접 구현하지 않고, HttpResponseWrapper 및 기타 System.Web.Abstractions을 시도합니다. 이렇게하면이 항목을 훨씬 쉽게 테스트 할 수 있습니다. :)

+0

안녕 데이비드 대단히 감사합니다, 나는 이것을 사용하고 있습니다 [string header] {get; 세트; } 지금은 테스트를 고치지 만, 기회가 생길 때 Abstractions를 보게 될 것이다. 나는이 [string header] {get; 세트; } 작동하지만 나는 그것을 조사 할 것이다. 건배. – Dave

관련 문제