Что такое заглушка в программировании
Перейти к содержимому

Что такое заглушка в программировании

  • автор:

Функция заглушка

Функция заглушка — в программировании — функция не выполняющая никакого осмысленного действия, возвращающая пустой результат или входные данные в неизменном виде. Аналогичное английское слово ‘stub’.

Используется:
Для наглядности при проектировании структуры классов приложения.
Часть функций может быть «заглушена» для отладки других функций.
Для ограничения доступа к некоторым полям класса(например корня дерева).

Пример функции-заглушки на языке C++

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

Wikimedia Foundation . 2010 .

Функция-заглушка

Функция-заглушка (в программировании) — функция, не выполняющая никакого осмысленного действия, возвращающая пустой результат или входные данные в неизменном виде. То же самое, что заглушка метода.

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

Пример функции-заглушки на языке C:

Связанные понятия

Итератор (от англ. iterator ― перечислитель) — интерфейс, предоставляющий доступ к элементам коллекции (массива или контейнера) и навигацию по ним. В различных системах итераторы могут иметь разные общепринятые названия. В терминах систем управления базами данных итераторы называются курсорами. В простейшем случае итератором в низкоуровневых языках является указатель.

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

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

Реку́рсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя. Термин «рекурсия» используется в различных специальных областях знаний — от лингвистики до логики, но наиболее широкое применение находит в математике и информатике.

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

Продолжение (англ. continuation) представляет состояние программы в определённый момент, которое может быть сохранено и использовано для перехода в это состояние. Продолжения содержат всю информацию, чтобы продолжить выполнения программы с определённой точки. Состояние глобальных переменных обычно не сохраняется, однако для функциональных языков это несущественно (выборочное сохранение/восстановление значений глобальных объектов в Scheme достигается отдельным механизмом dynamic-wind). Продолжения.

Мона́да — это абстракция линейной цепочки связанных вычислений. Монады позволяют организовывать последовательные вычисления.

Фунарг — сокращение от «функциональный аргумент»; в компьютерных науках, проблема фунарга относится к сложности реализации функций как первоклассных объектов в стеково-ориентированных языках программирования (в широком смысле, включая все языки, в которых передача параметров функциям осуществляется через стек).

Мемоизация (запоминание, от англ. memoization (англ.) в программировании) — сохранение результатов выполнения функций для предотвращения повторных вычислений. Это один из способов оптимизации, применяемый для увеличения скорости выполнения компьютерных программ. Перед вызовом функции проверяется, вызывалась ли функция ранее.

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

Чистота́ (в отношении языка программирования) — отсутствие побочных эффектов. Язык программирования является чистым в том случае, если все функции в программах этого языка являются чистыми.

Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.

Функциона́льное программи́рование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

Аппликативное программирование — один из видов декларативного программирования, в котором написание программы состоит в систематическом осуществлении применения одного объекта к другому. Результатом такого применения вновь является объект, который может участвовать в применениях как в роли функции, так и в роли аргумента и так далее. Это делает запись программы математически ясной. Тот факт, что функция обозначается выражением, свидетельствует о возможности использования значений-функций — функциональных.

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

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

Препроцессор С/С++ (англ. pre processor, предобработчик) — программа, подготавливающая код программы на языке C/C++ к компиляции.

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

Многопроходный компилятор (англ. Multi-pass compiler) — тип компилятора, который обрабатывает исходный код или абстрактное синтаксическое дерево программы несколько раз (в отличие от однопроходного компилятора, который проходит программу только один раз). Между проходами генерируется промежуточный код, который принимается следующим проходом в качестве входа. Таким образом, многопроходный компилятор обрабатывает код по частям, проход за проходом, а последний проход выдает финальный результат программы.

В программировании тип возвращаемого значения (англ. return type) или тип результата (англ. result type) определяет и накладывает ограничения на тип данных, возвращаемых методом или функцией. Во многих языках программирования (особенно это касается языков со статической типизацией, как например, Java, C++ и Си) возвращаемый тип должен быть явно указан при объявлении функции.

Перегрузка процедур и функций — возможность использования одноимённых подпрограмм: процедур или функций в языках программирования.

Каррирование (от англ. currying, иногда — карринг) — преобразование функции от многих аргументов в набор функций, каждая из которых является функцией от одного аргумента. Возможность такого преобразования впервые отмечена в трудах Готтлоба Фреге, систематически изучена Моисеем Шейнфинкелем в 1920-е годы, а наименование получило по имени Хаскелла Карри — разработчика комбинаторной логики, в которой сведение к функциям одного аргумента носит основополагающий характер.

Фортра́н (англ. Fortran) — первый язык программирования высокого уровня, получивший практическое применение, имеющий транслятор и испытавший дальнейшее развитие. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM. Название Fortran является сокращением от FORmula TRANslator (переводчик формул). Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных.

Макропроце́ссор (также макрогенера́тор) — программа, выполняющая преобразование входного текста в выходной при помощи задаваемых ей правил замены последовательностей символов, называемых правилами макроподстановки.

Мультиме́тод (англ. multimethod) или мно́жественная диспетчериза́ция (англ. multiple dispatch) — механизм, позволяющий выбрать одну из нескольких функций в зависимости от динамических типов или значений аргументов. Представляет собой расширение одиночной диспетчеризации (виртуальных функций), где выбор метода осуществляется динамически на основе фактического типа объекта, для которого этот метод был вызван. Множественная диспетчеризация обобщает динамическую диспетчеризацию для случаев с двумя или.

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

Функциональный объект (англ. function object), также функтор, функционал и функционоид — распространённая в программировании конструкция, позволяющая использовать объект как функцию. Часто используется как callback, делегат.

Опера́тор ветвле́ния (усло́вная инстру́кция, усло́вный опера́тор) — оператор, конструкция языка программирования, обеспечивающая выполнение определённой команды (набора команд) только при условии истинности некоторого логического выражения, либо выполнение одной из нескольких команд (наборов команд) в зависимости от значения некоторого выражения.

Фу́нкция в программировании — фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор, но многие языки допускают и безымянные функции. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была.

Си (англ. C) — компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но впоследствии был перенесён на множество других платформ. Согласно дизайну языка, его конструкции близко сопоставляются типичным машинным инструкциям, благодаря чему он нашёл применение в проектах, для которых был свойственен язык ассемблера.

Терна́рная усло́вная опера́ция (от лат. ternarius — «тройной») (обычно записывается как ?:) — во многих языках программирования операция, возвращающая свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом. Как можно судить из названия, тернарная операция принимает всего три указанных операнда. Аналогом тернарной условной операции в математической логике и булевой алгебре является условная дизъюнкция, которая записывается в виде и реализует алгоритм.

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

Сравне́ние в программировании — общее название ряда операций над па́рами значений одного типа, реализующих математические отношения равенства и порядка. В языках высокого уровня такие операции, чаще всего, возвращают булево значение («истина» или «ложь»).

Кореку́рсия — в теории категорий и информатике тип операции, дуальный к рекурсии. Обычно корекурсия используется (совместно с механизмом ленивых вычислений) для генерации бесконечных структур данных.

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

Ковариа́нтность и контравариа́нтность в программировании — способы переноса наследования типов на производные от них типы — контейнеры, обобщённые типы, делегаты и т. п. Термины произошли от аналогичных понятий теории категорий «ковариантный» и «контравариантный функтор».

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

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

Синтакси́ческий ана́лиз (или разбор, жарг. па́рсинг ← англ. parsing) в лингвистике и информатике — процесс сопоставления линейной последовательности лексем (слов, токенов) естественного или формального языка с его формальной грамматикой. Результатом обычно является дерево разбора (синтаксическое дерево). Обычно применяется совместно с лексическим анализом.

Ля́мбда-исчисле́ние (λ-исчисление) — формальная система, разработанная американским математиком Алонзо Чёрчем, для формализации и анализа понятия вычислимости.

Стати́ческая типиза́ция — приём, широко используемый в языках программирования, при котором переменная, параметр подпрограммы, возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменён позже (переменная или параметр будут принимать, а функция — возвращать значения только этого типа). Примеры статически типизированных языков — Ада, С++, C#, D, Java, ML, Паскаль, Nim.

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

Межпроцедурная оптимизация (англ. Interprocedural Optimization, IPO), или полнопрограммная оптимизация программ (англ. whole program optimization) — оптимизация компилятора, которая использует глобальный анализ потока управления и затрагивает множество процедур, даже находящихся в разных модулях, за счёт чего может достигаться существенный прирост быстродействия.

Вывод типов (англ. type inference) — в программировании возможность компилятора самому логически вывести тип значения у выражения. Впервые механизм вывода типов был представлен в языке ML, где компилятор всегда выводит наиболее общий полиморфный тип для всякого выражения. Это не только сокращает размер исходного кода и повышает его лаконичность, но и нередко повышает повторное использование кода.

Простая структура данных (англ. plain old data, POD) — в современных языках программирования высокого уровня тип данных, имеющий жёстко определённое расположение полей в памяти, не требующий ограничения доступа и автоматического управления. Переменные такого типа можно копировать простыми процедурами копирования участков памяти наподобие memcpy. Противоположность — управляемая структура данных.

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

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

Лямбда-выражение в программировании — специальный синтаксис для определения функциональных объектов, заимствованный из λ-исчисления. Применяется как правило для объявления анонимных функций по месту их использования, и обычно допускает замыкание на лексический контекст, в котором это выражение использовано. Используя лямбда-выражения можно объявлять функции в любом месте кода.

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

Использование заглушек для изоляции частей приложений друг от друга при модульном тестировании

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

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

Например, рассмотрим схему, которая иллюстрирует задействованные компоненты:

Diagram of Real and Stub classes of StockAnalyzer.

На этой схеме тестируемый компонент, StockAnalyzer как правило, зависит от другого компонента RealStockFeed . Однако возникает проблема для тестирования, RealStockFeed так как она возвращает разные результаты при каждом вызове методов. Эта изменчивость затрудняет обеспечение согласованного и надежного StockAnalyzer тестирования.

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

Ниже приведен пример использования внедрения зависимостей в коде:

public int GetContosoPrice(IStockFeed feed) => feed.GetSharePrice("COOO"); 
Public Function GetContosoPrice(feed As IStockFeed) As Integer Return feed.GetSharePrice("COOO") End Function 

Ограничения заглушки

Ознакомьтесь со следующими ограничениями для заглушки.

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

Создание заглушки: пошаговое руководство

Давайте начнем это упражнение с мотивирующим примером: одним из них, показанным на предыдущей схеме.

Создание библиотеки классов

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

Screenshot of Class Library project in Visual Studio.

  1. Откройте Visual Studio и создайте проект библиотеки классов.
  2. Настройте атрибуты проекта:
    • Задайте для имени проекта значение StockAnalysis.
    • Задайте для именирешения значение StubsTutorial.
    • Задайте для целевой платформы проекта значение .NET 8.0.
  3. Удалите файл по умолчанию Class1.cs.

Добавьте новый файл с именем IStockFeed.cs и скопируйте его в следующее определение интерфейса:

// IStockFeed.cs public interface IStockFeed
' IStockFeed.vb Public Interface IStockFeed Function GetSharePrice(company As String) As Integer End Interface 

Добавьте еще один новый файл с именем StockAnalyzer.cs и скопируйте его в следующее определение класса:

// StockAnalyzer.cs public class StockAnalyzer < private IStockFeed stockFeed; public StockAnalyzer(IStockFeed feed) < stockFeed = feed; >public int GetContosoPrice() < return stockFeed.GetSharePrice("COOO"); >> 
' StockAnalyzer.vb Public Class StockAnalyzer Private stockFeed As IStockFeed Public Sub New(feed As IStockFeed) stockFeed = feed End Sub Public Function GetContosoPrice() As Integer Return stockFeed.GetSharePrice("COOO") End Function End Class 

Создание тестового проекта

Создайте тестовый проект для упражнения.

Screenshot of Test project in Visual Studio.

  1. Щелкните правой кнопкой мыши решение и добавьте новый проект с именем MSTest Test Project.
  2. Задайте для имени проекта значение TestProject.
  3. Задайте для целевой платформы проекта значение .NET 8.0.

Добавление сборки Fakes

Добавьте сборку Fakes для проекта.

  1. Добавьте ссылку на StockAnalyzer проект. Screenshot of the command Add Project Reference.
  2. Добавьте сборку Fakes.
    1. В Обозреватель решений найдите ссылку на сборку:
      • Для более старого проекта .NET Framework (не в стиле пакета SDK) разверните узел Ссылки проекта модульного теста.
      • Для проекта в стиле SDK, предназначенного для .NET Framework, .NET Core или .NET 5.0 или более поздних версий, разверните узел Зависимости, чтобы найти сборку, которую нужно имитировать в разделе Сборки, Проекты или Пакеты.
      • При работе в Visual Basic на панели инструментов Обозревателя решений необходимо выбрать команду Показать все файлы, чтобы просмотреть узел Ссылки.
    2. Выберите сборку, содержащую определения классов, для которых требуется создать заглушки.
    3. В контекстном меню щелкните Добавить сборку Fakes. Screenshot of the command Add Fakes Assembly.

Создание модульного теста

Теперь создайте модульный тест.

Измените файл UnitTest1.cs по умолчанию, чтобы добавить следующее Test Method определение.

[TestClass] class UnitTest1 < [TestMethod] public void TestContosoPrice() < // Arrange: int priceToReturn = 345; string companyCodeUsed = ""; var componentUnderTest = new StockAnalyzer(new StockAnalysis.Fakes.StubIStockFeed() < GetSharePriceString = (company) => < // Store the parameter value: companyCodeUsed = company; // Return the value prescribed by this test: return priceToReturn; >>); // Act: int actualResult = componentUnderTest.GetContosoPrice(); // Assert: // Verify the correct result in the usual way: Assert.AreEqual(priceToReturn, actualResult); // Verify that the component made the correct call: Assert.AreEqual("COOO", companyCodeUsed); > > 
 _ Class UnitTest1 _ Public Sub TestContosoPrice() ' Arrange: Dim priceToReturn As Integer = 345 Dim companyCodeUsed As String = "" Dim componentUnderTest As New StockAnalyzer(New StockAnalysis.Fakes.StubIStockFeed() With < .GetSharePriceString = Function(company) ' Store the parameter value: companyCodeUsed = company ' Return the value prescribed by this test: Return priceToReturn End Function >) ' Act: Dim actualResult As Integer = componentUnderTest.GetContosoPrice() ' Assert: ' Verify the correct result in the usual way: Assert.AreEqual(priceToReturn, actualResult) ' Verify that the component made the correct call: Assert.AreEqual("COOO", companyCodeUsed) End Sub . End Class 

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

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

Screenshot of Solution Explorer showing all files.

Screenshot of Test Explorer.

  • Откройте Обозреватель теста и запустите тест.
  • Заглушки для различных видов членов типа

    Существуют заглушки для различных типов элементов типа.

    Методы

    В приведенном примере методы можно кусать путем присоединения делегата к экземпляру класса заглушки. Имя типа заглушки является производным от имен метода и параметров. Например, рассмотрим следующий IStockFeed интерфейс и его метод GetSharePrice :

    // IStockFeed.cs interface IStockFeed

    Прикрепляем заглушку к GetSharePrice использованию: GetSharePriceString

    // unit test code var componentUnderTest = new StockAnalyzer(new StockAnalysis.Fakes.StubIStockFeed() < GetSharePriceString = (company) => < // Store the parameter value: companyCodeUsed = company; // Return the value prescribed by this test: return priceToReturn; >>); 

    Если вы не предоставляете заглушку для метода, Fakes создает функцию, которая возвращает default value тип возвращаемого значения. Для чисел значение по умолчанию равно 0. Для типов классов по умолчанию используется null C# или Nothing Visual Basic.

    Свойства

    Методы получения свойств и методы задания предоставляются в виде отдельных делегатов и могут быть помечены по отдельности. Например, рассмотрим свойство Value интерфейса IStockFeedWithProperty .

    interface IStockFeedWithProperty < int Value < get; set; >> 

    Чтобы заглушить метод получения и задания Value и имитировать автоматическое свойство, можно использовать следующий код:

    // unit test code int i = 5; var stub = new StubIStockFeedWithProperty(); stub.ValueGet = () => i; stub.ValueSet = (value) => i = value; 

    Если вы не предоставляете методы заглушки для метода задания или получения свойства, Fakes создает заглушку, которая сохраняет значения, что делает свойство заглушки поведением простой переменной.

    События

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

    interface IStockFeedWithEvents

    Чтобы вызвать Changed событие, вызовите делегат резервного копирования:

    // unit test code var withEvents = new StubIStockFeedWithEvents(); // raising Changed withEvents.ChangedEvent(withEvents, EventArgs.Empty); 

    Универсальные методы

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

    interface IGenericMethod < T GetValue(); > 

    Вы можете заглушить GetValue экземпляр следующим образом:

    [TestMethod] public void TestGetValue() < var stub = new StubIGenericMethod(); stub.GetValueOf1(() => 5); IGenericMethod target = stub; Assert.AreEqual(5, target.GetValue()); > 

    Если код вызывает GetValue любой другой экземпляр, заглушка выполняет поведение.

    Заглушки виртуальных классов

    В предыдущих примерах заглушки создавались из интерфейсов. Однако вы также можете создавать заглушки из класса с виртуальными или абстрактными элементами. Например:

    // Base class in application under test public abstract class MyClass < public abstract void DoAbstract(string x); public virtual int DoVirtual(int n) < return n + 42; >public int DoConcrete() < return 1; >> 

    В заглушке, созданной из этого класса, можно задать методы делегата для DoAbstract() и DoVirtual() , но не для DoConcrete() .

    // unit test var stub = new Fakes.MyClass(); stub.DoAbstractString = (x) => < Assert.IsTrue(x>0); >; stub.DoVirtualInt32 = (n) => 10 ; 

    Если вы не предоставляете делегат для виртуального метода, Fakes может предоставить поведение по умолчанию или вызвать метод в базовом классе. Чтобы вызывался базовый метод, задайте свойство CallBase .

    // unit test code var stub = new Fakes.MyClass(); stub.CallBase = false; // No delegate set - default delegate: Assert.AreEqual(0, stub.DoVirtual(1)); stub.CallBase = true; // No delegate set - calls the base: Assert.AreEqual(43,stub.DoVirtual(1)); 

    Изменение поведения заглушек по умолчанию

    Каждый созданный тип заглушки содержит экземпляр IStubBehavior интерфейса через IStub.InstanceBehavior свойство. Это поведение вызывается всякий раз, когда клиент вызывает члена без присоединенного пользовательского делегата. Если поведение не задано, он использует экземпляр, возвращаемый свойством StubsBehaviors.Current . По умолчанию это свойство возвращает поведение, вызывающее исключение NotImplementedException .

    Поведение можно изменить в любое время, задав InstanceBehavior свойство для любого экземпляра заглушки. Например, следующий фрагмент кода изменяет поведение так, чтобы заглушка либо ничего не делает, либо возвращает значение по умолчанию возвращаемого типа default(T) :

    // unit test code var stub = new StockAnalysis.Fakes.StubIStockFeed(); // return default(T) or do nothing stub.InstanceBehavior = StubsBehaviors.DefaultValue; 

    Поведение также можно изменить глобально для всех объектов заглушки, в которых поведение не задано свойством StubsBehaviors.Current :

    // Change default behavior for all stub instances where the behavior has not been set. StubBehaviors.Current = BehavedBehaviors.DefaultValue; 

    Связанный контент

    Mock-объект (Мок, Объект-заглушка) — что это в программировании

    melisa's picture

    Mock — (от англ.«имитация») — в ООП это объект, служащий для целей тестирования и ведущий себя так же, как реальный объект, но при этом не являющийся «настоящим».

    Проще говоря, это заглушка — объект, поля и методы которого выдают константу, или случайную величину из допустимого диапазона значений (эти значения сам программист и хардкодит при создании mock-объекта).

    Mock-объект представляет собой фиктивную реализацию реального класса, предназначенную исключительно для тестирования .

    Использование

    Mock-объекты активно используются в разработке через тестирование.

    Обычно Mock-и создаются для симулирования работы с:

    • хранилищами данных (СУБД)
    • внешними API
    • другими классами приложения, реализующими бизнес-логику, но не тестируемыми в данном конкретном тесте

    Примеры

    • Простейшее создание мока на PHP
    • Ошибка Method name matcher is not defined, cannot define parameter matcher without one

    Источник

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *