Как убедиться, что метод CreateChildControls () вызывается при модульном тестировании пользовательских веб-элементов управления ASP.NET? - PullRequest
0 голосов
/ 10 февраля 2010

Я хочу провести модульное тестирование своего движка рендеринга для приложения ASP.NET. У меня есть некоторые пользовательские элементы управления, созданные в этом приложении. Большинство этих элементов управления полагаются на метод CreateChildControls (), вызываемый механизмом ASP.Net, во время первоначального вызова или обратной передачи. При запуске теста CreateChildControls () не вызывается и элемент управления находится в «недопустимом» состоянии.

В качестве обходного пути для запуска тестов я явно вызываю какой-то другой открытый метод, который вызывает в нем EnsureChildControls (). Это фактически приводит к выполнению CreateChildControls () и правильной инициализации элемента управления (как обычно при размещении на веб-сервере). Я хотел бы избавиться от этого дополнительного вызова метода и элемента управления, чтобы он все еще находился в надлежащем состоянии для тестирования.

Есть ли элегантные решения этой проблемы?

1 Ответ

1 голос
/ 10 февраля 2010

В качестве альтернативы вы можете использовать отражение для непосредственного вызова CreateChildControls, что исключает необходимость использования открытого метода для его вызова. Это было бы достаточно просто:

var methodInfo = control.GetType().GetMethod("CreateChildControls", BindingFlags.Instance | BindingFlags.NonPublic);
methodInfo.Invoke(control, new object[] { });

Вы можете вставить этот код куда-нибудь, так что вам нужно будет сделать это только один раз и использовать его снова.

РЕДАКТИРОВАТЬ : ваш тест может наследоваться и от вашего элемента управления, поэтому вы можете напрямую вызывать некоторые из этих методов. Но вы должны создать экземпляр своего контроля, создав тест, а не элемент управления, как в:

public class CtlTest : Ctl
{
  [Test]
  public void A()
  {
    var ctl = new CtlTest();
    ctl.RecreateChildControls(); //protected, but can be accessed because of inheritance

  }
}

НТН.

...