Как сделать приложение ASP.NET Webforms тестируемым? - PullRequest
2 голосов
/ 21 февраля 2012

Я смотрю на унаследованное корпоративное приложение, написанное с использованием ASP.NET. Нет элементов управления или веб-форм. Вот как это работает:

EmployeeList.aspx :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EmployeeList.aspx.cs" Inherits="EmployeeList" %>

EmployeeList.aspx.cs :

protected void Page_Load(object sender, EventArgs e)
{
    // Security Check

    // Load Template, get version 1.4 of active employee list
    StringBuilder template = GetTemplate("Employee", "ActiveList", "1.4", true);

    // Get list from database
    using(SqlDataReader objReader = GetListFromDB()) 
    {
        while(objReader.Read()) 
        {
            //fills data
            TUtils.Replace(template, ROW, "%name%", objReader[0]);
        }
    }

    // return response
    Response.Write(template.ToString());
}

private StringBuilder GetTemplate(string x, string y, string v, bool z);
{
    // returns template
}

private SqlDataReader GetListFromDB() {
    // returns data reader
}

Мой вопрос таков: поскольку мы не используем веб-формы, есть ли способ ввести NUnit в эту модель, управляемую событиями (как показано выше)?

Также, пожалуйста, избегайте предложений по переходу на ASP.NET MVC или другие шаблоны, которые мы рассматриваем, но интересно, есть ли способ преобразовать это тестируемое корпоративное приложение.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Это абсолютно возможно.Вы должны взглянуть на реализацию шаблона MVP с ASP.NET Webforms.Существует несколько реализаций с открытым исходным кодом, но вы можете сделать небольшую специализированную по своему усмотрению.

Основа состоит в том, чтобы переместить ваш код за логику в класс презентатора.Класс Presenter имеет ссылку на страницу, реализующую интерфейс.Хитрость в вашем случае заключается в том, чтобы макетировать объект Page.Response для вашего теста.Вот почему это трудно для модульного тестирования это правильно.Свойство PageResponse содержит объект, производный от HttpResponseBase, и это базовый класс, который вы должны смоделировать в своих тестах и ​​выполнить свои утверждения на своем примере.Вы можете начать с этого, а затем расширить возможности своего докладчика, например Session, Request и т. Д.

Если у вас вообще нет разметки, возможно, вы просто создадите докладчика в конструкторе представления и не будете беспокоитьсяиметь и ссылаться на мнение.

Чтобы уточнить: большая хитрость заключается в том, чтобы получить код из файла aspx.cs.Этот зверь не подлежит тестированию.

Пример базового класса для докладчиков:

public class Presenter<T> where T : class, IView
    {
        protected readonly T View;

        protected Presenter(T view, ILogger logger)
        {
            View = view;
        }

        public virtual void page_PreRender(object sender, EventArgs e)
        {
        }

        public virtual void page_Init(object sender, EventArgs e)
        {
        }

        public virtual void page_Load(object sender, EventArgs eventArgs)
        {
        }

        public HttpContextBase HttpContext { protected get; set; }

        protected HttpRequestBase Request
        {
            get { return HttpContext.Request; }
        }
    }
0 голосов
/ 21 февраля 2012

Поскольку большая часть вашего кода находится в выделенном коде, я не думаю, что обычный подход к тестированию с инфраструктурой тестирования NUnit / Visual Studio будет работать хорошо.

Тем не менее, я думаю, что одним из возможных подходов является использование таких сред UI Testing, как WATIN / Selenium . Это позволит вам по-прежнему писать тесты для различных функций. В прошлом я делал нечто похожее, в основном написав контрольный пример для каждого действия пользовательского интерфейса, которое приводит к обратной передаче на сервере. Может быть не идеальным, но позволяет автоматизировать тестирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...