ASP.NET - Как вы проводите модульное тестирование WebControls?

StackOverflow https://stackoverflow.com/questions/31151

  •  09-06-2019
  •  | 
  •  

Вопрос

Хорошо.

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

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

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

Есть какие-нибудь указания?

Горит

Это было полезно?

Решение

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

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

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

Другие советы

ЕЭС в assembly:InternalsVisibleTo присвоите этот атрибут, и вы сможете получить доступ к этим закрытым участникам.

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

[assembly:InternalsVisibleTo("YourTestProjectName")]

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

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

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

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

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

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

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

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

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

Вы также можете взглянуть на это Иглу для Носорогов рамки.Это скомпрометированный MVC-фреймворк для WebForms.

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

Вы тестируете их вот так:

[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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top