Поблочное тестирование HttpApplication

Словари имеют получать () метод

, Словари имеют, 'получают ()' метод. Если Вы делаете d ['ключ'] и ключ не там, Вы получаете исключение. Если Вы делаете d.get ('ключ'), Вы не возвращаете Ни один, если 'ключ' не там. Можно добавить второй аргумент для возвращения того объекта вместо Ни одного, например: d.get ('ключ', 0).

Это является большим для вещей как сложение чисел:

sum[value] = sum.get(value, 0) + 1

12
задан David Brown 25 July 2009 в 15:44
поделиться

2 ответа

К сожалению, сделать это не так-то просто, поскольку HttpApplication не очень легко поддается издевательству; нет интерфейса, над которым можно было бы издеваться, и большинство методов не помечены как виртуальные.

Недавно у меня была аналогичная проблема с HttpRequest и HttpWebResponse. В конце концов, решение, к которому я пошел, заключалось в создании прямой «сквозной» оболочки для методов, которые я хотел использовать:

public class HttpWebRequestWrapper : IHttpWebRequestWrapper
    {
        private HttpWebRequest httpWebRequest;

        public HttpWebRequestWrapper(Uri url)
        {
            this.httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        }

        public Stream GetRequestStream()
        {
            return this.httpWebRequest.GetRequestStream();
        }

        public IHttpWebResponseWrapper GetResponse()
        {
            return new HttpWebResponseWrapper(this.httpWebRequest.GetResponse());
        }

        public Int64 ContentLength
        {
            get { return this.httpWebRequest.ContentLength; }
            set { this.httpWebRequest.ContentLength = value; }
        }

        public string Method 
        {
            get { return this.httpWebRequest.Method; }
            set { this.httpWebRequest.Method = value; }
        }

        public string ContentType
        {
            get { return this.httpWebRequest.ContentType; }
            set { this.httpWebRequest.ContentType = value; }
        }
}

и т.д. и т.д.

Это позволило мне поиздеваться над своим собственным интерфейсом оболочки. Не обязательно самая элегантная вещь в мире, но очень полезный способ имитировать некоторые из менее «высмеиваемых» частей фреймворка.

Однако, прежде чем вы броситесь делать это, стоит пересмотреть то, что вы got и посмотреть, есть ли лучший подход к вашим тестам, который бы избавил вас от необходимости переносить классы.

В случае HttpWebRequest, HttpApplication и др. IMHO часто отсутствует.

Чтобы установить эту оболочку в имитации (используя мой пример HttpWebRequest выше), вы затем делаете что-то подобное с помощью Moq:

var mockWebRequest = new Mock<IHttpWebRequestWrapper>();
mockWebRequest.SetupSet<string>(c => c.Method = "POST").Verifiable();
mockWebRequest.SetupSet<string>(c => c.ContentType = "application/x-www-form-urlencoded").Verifiable();
mockWebRequest.SetupSet<int>(c => c.ContentLength = 0).Verifiable();
10
ответ дан 2 December 2019 в 21:03
поделиться

IMHO, добавление функциональности путем расширения HttpApplication - не лучшее решение. Из-за частных / внутренних / запечатанных классов настолько сложно имитировать HttpContext, что даже если вы добьетесь успеха, ваши модульные тесты будут настолько загромождены имитирующим кодом, что вы больше не сможете понять, что вы на самом деле тестируете.

Не могли бы вы подробнее рассказать, какие функции вы добавляете? Может быть, есть лучший способ добавить эту функциональность в ваше приложение.

2
ответ дан 2 December 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: