Пятница, 10.04.2026
Мой сайт
Меню сайта
Мини-чат
Наш опрос
Оцените мой сайт
Всего ответов: 1
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » 2014 » Март » 16 » Изоляция тестируемого кода с помощью Microsoft Fakes
20:04
 

Изоляция тестируемого кода с помощью Microsoft Fakes

Microsoft Fakes помогает вам изолировать код при тестировании, заменив внешние, по отношению к нему, части приложения заглушками или обертками. Речь идет о небольших фрагментах кода, контролируемых вашими тестами. Изолируя код при тестировании, вы понимаете, что если тест не прошел, то проблема в нем, а не где-то еще. Заглушки и обертки позволяет тестировать код даже в тех случаях, когда другие части вашего приложения не работают.

Fakes бывает двух видов:

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

  • оболочка изменяет скомпилированный код приложения во время выполнения так, что вместо вызова заданного метода, выполняется код оболочки, описанный в тесте. Оболочки можно использовать, чтобы заменить вызовы в сборках, которые вы не можете изменить, например .NET сборки.

Имитации замещают другие компоненты

Требования

  • Visual Studio Ultimate

Выбор между заглушкой и оберткой.

Обычно, вы рассматриваете проект Visual Studio как компонент, поскольку вы разрабатываете и изменяете его классы в одно и тоже время. Вы будите рассматривать возможность использования заглушек и оберток, в зависимости от вызовов, которые выполняет проект к другим проектам в решении или к другим сборкам, на которые он ссылается.

Как общие рекомендации, используйте заглушки для вызовов внутри решения Visual Studio и обертки при обращениях к сторонним сборкам. Это так, потому что в своем решение хорошей практикой является разделение компонентов посредством интерфейсов, таким образом, чтобы использовались заглушки. Однако внешние сборки, такие как System.dll, обычно не предоставляются с отдельно определенными интерфейсами, поэтому следует использовать обертки.

Другие вопросы:

Производительность. Заклинивает выполняются медленно выполняется, поскольку они перезаписывают код во время выполнения. Заглушки не имеют такой нагрузку производительности и, насколько быстро как виртуальные методы необходимы.

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

Внутренние типы И заглушки и оболочки можно использовать с внутренними типами, которые становятся доступными с помощью атрибута сборки InternalsVisibleToAttribute.

Закрытые методы. Оболочки могут заменить вызовы к закрытым методам, если все типы в сигнатуре метода являются видимыми. Суррогаты могут заменить только видимые методы.

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

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

Начало работы с заглушками
  1. Впрысните интерфейсы

    Для использования заглушек необходимо написать код для запуска таким образом, чтобы он явно не упоминает классы в компонентах приложения. "Компонентом" связанного значим класс или классы, которые разработаны и обновляются вместе, и обычно содержатся в одном проекте Visual Studio. Переменные и параметры должны быть объявлены с помощью интерфейсов и экземпляры других компонентов необходимо передавать в или создаются с помощью фабрики. Например, если StockFeed класс в компонентах приложений это будет считаться неудачей.

    return (new StockFeed()).GetSharePrice("COOO"); // Bad

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

    public int GetContosoPrice(IStockFeed feed) { return feed.GetSharePrice("COOO"); }
  2. Добавьте сборку фальшивок

    1. В обозревателе решений разверните представляют собой список тестового проекта. При работе в Visual Basic, необходимо выбрать Показать все файлы для просмотра списка представляют собой.

    2. Выделите ссылку на сборку, в которой интерфейс (например IStockFeed) указан. В контекстном меню данной ссылки выберите Добавить сборку имитаций.

    3. Вновь Выполните сборку решения.

  3. В тестах, построение экземпляры заглушки и предоставить код для своих методов:

    [TestClass] class TestStockAnalyzer { [TestMethod] public void TestContosoStockPrice() { // Arrange: // Create the fake stockFeed: IStockFeed stockFeed = new StockAnalysis.Fakes.StubIStockFeed() // Generated by Fakes. { // Define each method: // Name is original name + parameter types: GetSharePriceString = (company) => { return 1234; } }; // In the completed application, stockFeed would be a real one: var componentUnderTest = new StockAnalyzer(stockFeed); // Act: int actualValue = componentUnderTest.GetContosoPrice(); // Assert: Assert.AreEqual(1234, actualValue); } ... }

    Представляет элемент волшебства здесь класс StubIStockFeed. Для каждого интерфейса в сборке механизм Microsoft Fakes создает класс заглушки. Имя класса, производного от имени заглушки интерфейса, с "Fakes.Stub" в качестве префикса и добавлены имена типа параметра.

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

Начало работы с оболочками

Предположим, что компонент содержит вызовы DateTime.Now:

// Code under test: public int GetTheCurrentYear() { return DateTime.Now.Year; }

Во время тестирования, который будут заклинить свойство Now, поскольку существует версия неудобным возвращает новое значение при каждом вызове.

Для использования оболочек не следует изменять код приложения или запись ему способ.

  1. Добавьте сборку фальшивок

    В обозревателе решений откройте ссылки проекта модульного теста и выделите ссылка на сборку, содержащую метод требуется подмена идентификаторов. В этом примере класс DateTime в System.dll. Чтобы просмотреть ссылки в проекте Visual Basic, выберите Показать все файлы.

    Выберите Добавить сборку имитаций.

  2. Вставьте в оболочку ShimsContext

    [TestClass] public class TestClass1 { [TestMethod] public void TestCurrentYear() { int fixedYear = 2000; // Shims can be used only in a ShimsContext: using (ShimsContext.Create()) { // Arrange: // Shim DateTime.Now to return a fixed date: System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(fixedYear, 1, 1); }; // Instantiate the component under test: var componentUnderTest = new MyComponent(); // Act: int year = componentUnderTest.GetTheCurrentYear(); // Assert: // This will always be true if the component is working: Assert.AreEqual(fixedYear, year); } } }

    Имена классов оболочки строятся с помощью префикса Fakes.Shim на имя исходного типа. Имена параметров добавляются в имени метода.

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

System.IO.Fakes.ShimFile.AllInstances.ReadToEnd = ...

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

Просмотров: 7662 | Добавил: withamuch | Рейтинг: 0.0/0
Всего комментариев: 0
Поиск
Календарь
«  Март 2014  »
Пн Вт Ср Чт Пт Сб Вс
     12
3456789
10111213141516
17181920212223
24252627282930
31
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2026
    Бесплатный хостинг uCoz