Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Примечание

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

*****************************

Хорошим

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

Тесты и MVC Framework

После прочтения предыдущей части главы можно было убедиться, что создание теста логики веб-приложения, построенного на базе MVC Framework, — задача простая. Этот эффект достигается за счет того, что ядро веб-приложения, состоящее из контроллеров и слоя работы с данными (моделей), может быть выделено в независимую от среды сборку и тестироваться вне контекста веб-сервера и без генерации разметки представления. Даже в тех случаях, когда среде выполнения необходимо взаимодействие с объектами, отвечающими за ввод/вывод разметки и запросов, передаваемых между пользователем и сервером, используются абстрактные классы (например, HttpRequestBase), реализация которых может быть подменена в тестовой среде.

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

Для поддержки возможности замены конкретной реализации необходимо использовать интерфейсы для основных зависимостей действий контроллеров. Например, если в приложении есть выделенный объект, отвечающий за восстановление и сохранение объектов данных DataManager, то в контроллерах следует использовать интерфейс iDataManager, который реализует конкретный класс DataManager. Таким образом, во время проведения тестов объект DataManager может быть подменен объектом DataManagerMock, не содержащим полного функционала работы с данными и, возможно, даже не работающим с базой данных. Этот распространенный подход к тестированию называется имитацией (англ. moking).

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

Рассмотрим создание более сложного теста на примере тестового

сценария для контроллера Accountcontroller, входящего в шаблон MVC-приложения. В листинге 8.2 приведен фрагмент кода Accountcontroller, демонстрирующий использование интерфейсов в конструкторах класса.

Листинг 8.2. Фрагмент кода класса Accountcontroller

public class Accountcontroller : Controller

{

public Accountcontroller : this(null, null)

{

}

public AccountController(IFormsAuthentication formsAuth,

IMembershipService service)

{

FormsAuth = formsAuth ?? new FormsAuthenticationService;

MembershipService = service ?? new AccountMembershipService;

}

public IFormsAuthentication FormsAuth

{

get;

private set;

}

public IMembershipService MembershipService

{

get;

private set;

}

}

Поскольку в контроллере Accountcontroller используются компоненты инфраструктуры ASP.NET, отвечающие за аутентификацию пользователей и управление учетными записями, для них созданы специальные обертки, приведенные в листинге 8.3, реализующие интерфейсы IFormsAuthentication и IMembershipService.

Листинг 8.3. Интерфейсы и реализация поддержки базовых служб

public interface IFormsAuthentication

{

void SignIn(string userName, bool createPersistentcookie);

void SignOut;

}

public class FormsAuthenticationService : IFormsAuthentication

{

public void SignIn(string userName, bool createPersistentCookie)

{

FormsAuthentication.SetAuthCookie(userName,

createPersistentCookie);

}

public void SignOut

{

FormsAuthentication.SignOut;

}

}

public interface IMembershipService

{

int MinPasswordLength { get; }

bool ValidateUser(string userName, string password);

MembershipCreateStatus CreateUser(string userName,

string password, string email);

bool ChangePassword(string userName,

string oldPassword, string newPassword);

}

public class AccountMembershipService : IMembershipService

{

private MembershipProvider _provider;

public AccountMembershipService

: this(null)

{

}

public AccountMembershipService(MembershipProvider provider)

{

_provider = provider ?? Membership.Provider;

}

public int MinPasswordLength

{

get

{

return _provider.MinRequiredPasswordLength;

}

}

public bool ValidateUser(string userName, string password)

{

return _provider.ValidateUser(userName, password);

Поделиться:
Популярные книги

Клан Кеннеди

Чернявский Георгий Иосифович
1445. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Клан Кеннеди

Дорога в рай

Даль Роальд
Даль, Роальд. Сборники
Проза:
современная проза
5.00
рейтинг книги
Дорога в рай

Золушка (сборник)

Макбейн Эд
Мастера остросюжетного романа
Детективы:
полицейские детективы
5.00
рейтинг книги
Золушка (сборник)

НОВОСТИ ИЗ КРЕМЛЯ

Зенькович Николай Александрович
Научно-образовательная:
история
5.00
рейтинг книги
НОВОСТИ ИЗ КРЕМЛЯ

Дневник. Том III. 1860-1861. Созерцательное богословие. Крупицы от трапезы Господней

Кронштадтский Иоанн
Религия и эзотерика:
религия
православие
христианство
5.00
рейтинг книги
Дневник. Том III. 1860-1861. Созерцательное богословие. Крупицы от трапезы Господней

Конфликт чести. Агент перемен. Лови день

Ли Шарон
Золотая библиотека фантастики
Фантастика:
боевая фантастика
6.25
рейтинг книги
Конфликт чести. Агент перемен. Лови день

Особое мнение (Сборник)

Дик Филип Киндред
4. The Collected Stories of Philip K. Dick
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Особое мнение (Сборник)

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7

Том 38. Полное собрание сочинений.

Толстой Лев Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Том 38. Полное собрание сочинений.

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.25
рейтинг книги
Дважды одаренный

Мусульманские имена

Ибн Мирзакарим ал-Карнаки
Справочная литература:
справочники
словари
5.00
рейтинг книги
Мусульманские имена

Рассказы

Фолкнер Уильям Катберт
Проза:
классическая проза
5.00
рейтинг книги
Рассказы

Бернард Шоу

Пирсон Хескет
След в истории
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Бернард Шоу