Тесты Nunit на Response.Cache.VaryByHeader - PullRequest
       14

Тесты Nunit на Response.Cache.VaryByHeader

0 голосов
/ 19 августа 2011

Я провожу модульное тестирование с использованием NUnit и NSubstitute для функции, которая использует HttpResponse. Я знаю, что вы не можете смоделировать эти объекты, поэтому я создал интерфейсы для их представления и некоторых свойств.

IУ меня проблемы с пониманием того, как создать интерфейс для 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 в интерфейсе, а затем использовать его в конкретном классе?

1 Ответ

0 голосов
/ 21 августа 2011

Ошибка, по-видимому, указывает на то, что IHttpCacheVaryByHeaders не имеет объявленного индексатора (например, bool this[string header] { get; set; }), но вместо того, чтобы реализовать эти оболочки самостоятельно, попробуйте HttpResponseWrapper и другие System.Web.Abstractions .Это должно сделать тестирование намного проще.:)

...