Как проверить серверные элементы управления asp.net - PullRequest
3 голосов
/ 10 июня 2009

Мы разработали несколько серверных элементов управления ASP.Net, и нам нужно их протестировать. Я хочу создать экземпляр элемента управления, установить некоторые свойства, вызвать CreateChildControls и проверить иерархию элементов управления.

Я столкнулся с рядом проблем:

  1. Элементы управления зависят от HttpContext
  2. CreateChildControls является частным

Даже добавление одного дочернего элемента управления в коллекцию элементов управления вызывает метод ResolveAdapter (), который основан на HttpContext.

Как я могу обойти это?

p.s. Я не хочу проверять элементы управления на странице (!).

1 Ответ

1 голос
/ 10 июня 2009

Звучит так, будто вы не заботитесь о фактическом рендеринге элемента управления, а скорее о логике, содержащейся в элементе управления. Для этого я хотел бы предложить, что у вас есть другая проблема, помимо невозможности проверить элемент управления вне HttpContext.

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

Извлеките бизнес-логику в отдельный Project / Dll где-нибудь и подумайте о реализации шаблона MVP с управлением сервером. Вам не нужно использовать большие тяжелые фреймворки, такие как WCSF. Концептуально вы можете реализовать это без особых усилий.

Создайте интерфейс, который представляет значения в вашем представлении:

public interface IOrderView
{
    Int32 ID{get; set;}
    String Name{get; set;}
    List<Item> Items {set;}
}

Как только это будет определено, вам нужен докладчик, который осуществляет это представление:

public class OrderPresenter
{
    public IOrderView View {get; set;}

    public void InitializeView()
    {
        //Stuff that only happens when the page loads the first time

        //This is only for an example:
        var order = Orders.GetOrder(custId);

        View.ID = order.ID;
        View.Name = order.Name;
        View.Items = order.Items;
    }

    public void LoadView()
    {
        //Stuff that happens every page load
    }
}

Теперь серверный элемент управления может реализовать этот интерфейс и инициализировать себя с помощью OrderPresenter

public class OrderControl: Panel, IOrderView
{
    private OrderPresenter Presenter{get; set;}

    public OrderControl()
    {
        //Create new presenter and initialize View with reference
        // to ourselves
        Presenter = new OrderPresenter{View = this;}
    }

    protected override void OnLoad(EventArgs e)
    {
        if(Page.IsPostback)
        {
            _presenter.InitializeView();
        }

        _presenter.LoadView();

        //Other normal onload stuff here...
    }

    //Now for the interface stuff
    public Int32 ID
    {
        get{ return Int32.Parse(lblOrderId.Text); } 
        set{ lblOrderId.Text = value.ToString(); }
    }

    public String Name
    {
        get{ return lblOrderName.Text; } 
        set{ lblOrderName.Text = value; }
    }

    public List<Item> Items 
    {
        set
        {
            gvItems.DataSource = value;
            gvItems.DataBind();
        }
    }
}

И вот оно у вас! Теперь вы сможете писать модульные тесты для OrderPresenter, используя заглушенный вид. HttpContext не требуется, и у вас более четкое разделение проблем.

Если у вас уже есть вся ваша бизнес-логика, тогда я прошу прощения, но я не могу придумать какой-либо другой причины для проверки серверного элемента управления вне среды выполнения ASP.Net, кроме необходимости проверки реальной бизнес-логики. Если это является случаем, то я настоятельно рекомендую вам провести рефакторинг сейчас, прежде чем вы поймете, что кошмар обслуживания, который это в конечном итоге вызовет через Leaky Abstractions .

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