Подтвердить что ты не робот

ASP.NET - Как вы Unit Test WebControls?

Хорошо.

Итак, я размышляю о времени, которое я получаю в модульном тестировании, так как все так долго хватались об этом. Я установил NUnit и прошел несколько учебников типа intro to unit testing.

В настоящее время я собираю небольшую инфраструктуру, чтобы помочь в восстановлении одного из наших веб-приложений, поэтому я создал проект VS2008 для своей структуры, и я хочу unit test его по мере того как я иду.

Как я могу начать тестирование модуля WebControls? Все методы защищены или приватны, и поскольку это структура, там не так много, кроме WebControls.

Любые указатели?

Бернс

4b9b3361

Ответ 1

Вы можете создавать архитектуры типа модели-просмотра или модели-представления-презентатора без использования полномасштабной структуры. Вы уже выяснили, что юнит-тестирование ui-компонентов сложно. Есть способы обойти это, но вы, вероятно, не хотите идти по этому маршруту. Обычно это будет очень сложно поддерживать ваши тесты, больше кошмара обслуживания - это то, что программисты могут обойти: -)

Попробуйте выделить функциональность, которую вы хотите протестировать, в классе "контроллер" или "презентатор". Затем проверьте этот класс. Чтобы сделать его более проверяемым, вы можете скрыть класс usercontrol (представление) за интерфейсом и заставить диспетчер или ведущий поговорить с представлением через интерфейс. Таким образом, вы можете макетировать представление в своих тестах.

Я знаю, что это звучит как большая работа, и это похоже на обходной путь, но если вы привыкнете к этому, это очень хорошая архитектура, которая значительно упрощает изменение поведения ui. Вы всегда можете начать использовать "реальную" инфраструктуру mvc, когда вам это действительно нужно: -)

Ответ 2

Ues assembly:InternalsVisibleTo, и вы сможете получить доступ к этим частным членам.

Поместите его в свой проект webcontrol AssemblyInfo.cs(в разделе Свойства node)

[assembly:InternalsVisibleTo("YourTestProjectName")]

Ответ 3

Вы нашли самую большую причину боли ASP.NET. Что касается закрытых, частных классов, которые препятствуют единичному тестированию.

Это основная причина, по которой люди TDD будут использовать инфраструктуру MVC (ASP.NET MVC, Castle MonoRail), поскольку она обеспечивает четкое разделение с вашими шаблонами просмотров и логикой вашего контроллера. Контроллеры полностью проверяются.

Ответ 4

Это является старой статьей, но я использовал NUnitASP для записи тестов nunit для asp.net WebControls в 2004 году. Эта статья дает подробный пример тестирования простого элемента управления, используя их концепцию создания соответствующего класса "Тестер", который инкапсулирует детали вашего контроля из ваших тестов. Тестер может (должен) также находиться в той же самой сборке, что и ваш элемент управления, поэтому может делиться некоторыми вещами между ними (например, служебными функциями, константами и т.д.).

Я использовал эту технику (и другие используют варианты техники) до сих пор, чтобы проверить очень сложные элементы управления.

Я надеюсь, что это будет полезно.

Ответ 5

Вы также можете посмотреть на тестирование компонентов через браузер, поскольку пользователь увидит их с помощью платформы тестирования, такой как WebAii. Я видел, как он работает, и это довольно круто. Мне также сказали, что вы можете подключить его к автоматическим сборкам, но я пока этого не видел.

Надеюсь, что это поможет...

Ответ 6

Основа MVC, упомянутая выше, является лучшим способом проверить, что делает элемент управления. Однако тестирование того, как это работает, немного отличается.

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

Ответ 7

Вы также можете взглянуть на эту Rhino Igloo. Это скомпрометированная среда MVC для WebForms.

Ответ 8

Ivonna может тестировать WebControls изолированно, в контексте Asp.Net Просто вызовите session.GetControl( "Path.ascx" ) и убедитесь, что он имеет все необходимые свойства.

Ответ 9

Вы проверяете их следующим образом:

[Test]
public void ConditionQueryBuilderTest_RendersProperHtml()
{
    var sw = new StringWriter();
    var queryBuilder = new ConditionQueryBuilderStub
    {
        ID = "UnitTestbuilder",
        QueryBuilderURL = @"\SomeAspxPage\SomeWebMethod",
        ResetQueryBuilderURL = @"\SomeAspxPage\OnQueryBuilderReset",
        FilterValuesCollection = new Dictionary<int, string> { {15, "Some Condition"}}
    };
    queryBuilder.RenderAllContents(new HtmlTextWriter(sw));

    AppendLog(sw.ToString());

    Assert.AreEqual(ExpectedHtml, sw.ToString()); // ExpectedHTML is the raw expected HTML
}

Вот мой заглушка:

internal class ConditionQueryBuilderStub : ConditionQueryBuilder // ConditionQueryBuilder is a WebControl
{
    internal void RenderAllContents(HtmlTextWriter writer)
    {
        RenderContents(writer);
    }
}