В чем разница между макетом и заглушкой? - PullRequest
817 голосов
/ 11 августа 2010

Я читал различные статьи о насмешках против окурков в тестировании, в том числе Насмешки Мартина Фаулера не являются заглушками , но до сих пор не понимаю разницу.

Ответы [ 35 ]

18 голосов
/ 08 июля 2012

Я думаю, что самое важное различие между ними заключается в их намерениях.

Позвольте мне попытаться объяснить это в ПОЧЕМУ заглушка против ПОЧЕМУ издеваться

Предположим, я пишу тестовый код для общедоступного контроллера временной шкалы моего mac-клиента

Вот пример тестового кода

twitter_api.stub(:public_timeline).and_return(public_timeline_array)
client_ui.should_receive(:insert_timeline_above).with(public_timeline_array)
controller.refresh_public_timeline
  • STUB: сетевое подключение к Twitter API оченьмедленный, что делает мой тест медленным.Я знаю, что он вернет временные шкалы, поэтому я сделал заглушку, имитирующую HTTP Twitter API, чтобы мой тест выполнялся очень быстро, и я могу запустить тест даже в автономном режиме.
  • MOCK: Я еще не написал ни один из моих методов пользовательского интерфейса, и я не уверен, какие методы мне нужно написать для моего объекта пользовательского интерфейса.Я надеюсь узнать, как мой контроллер будет взаимодействовать с моим объектом пользовательского интерфейса, написав тестовый код.

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

Предлагаю прочитать эту статью, если вы пытаетесь узнать больше о макетах: http://jmock.org/oopsla2004.pdf

16 голосов
/ 25 июня 2015

Быть очень понятным и практичным:

Заглушка: класс или объект, который реализует методы класса / объекта, которые нужно подделать и всегда возвращает то, что вы хотите.

Пример на JavaScript:

var Stub = {
   method_a: function(param_a, param_b){
      return 'This is an static result';
   }
}

Макет: то же самое для заглушки, но он добавляет некоторую логику, которая «проверяет», когда вызывается метод, так что вы можете быть уверены, что какая-то реализация вызывает этот метод.

Как говорит @mLevan, представьте в качестве примера, что вы тестируете класс регистрации пользователей.После вызова Save, он должен вызвать SendConfirmationEmail.

Очень глупый код Пример:

var Mock = {
   calls: {
      method_a: 0
   }

   method_a: function(param_a, param_b){
     this.method_a++; 
     console.log('Mock.method_a its been called!');
   }
}
14 голосов
/ 07 ноября 2018

Использование ментальной модели действительно помогло мне понять это, а не все объяснения и статьи, которые не совсем «утонули».

Представьте, что у вашего ребенка есть стакантарелка на столе, и он начинает играть с ним.Теперь вы боитесь, что оно сломается.Итак, вместо этого вы даете ему пластиковую тарелку.Это будет Mock (такое же поведение, тот же интерфейс, "более мягкая" реализация).

Теперь, скажем, у вас нет замены пластика, поэтому вы объясняете: «Если вы продолжите играть с ним, он сломается!».Это заглушка , вы заранее указали заранее заданное состояние.

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

14 голосов
/ 05 июня 2017

Этот слайд очень хорошо объясняет основные различия.

enter image description here

* Из CSE 403 Лекция 16, Университет Вашингтона (слайд, созданный Марти Степпом)«)

11 голосов
/ 20 февраля 2016

Мне нравится объяснение Роя Ошерова [ссылка на видео] .

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

10 голосов
/ 20 февраля 2018
  • Заглушки против издевательств
    • Столбики
      1. предоставить конкретные ответы на вызовы методов
        • ex: myStubbedService.getValues ​​() просто возвращает строку, необходимую для тестируемого кода
      2. используется тестируемым кодом для его изоляции
      3. не может пройти тест
        • ex: myStubbedService.getValues ​​() просто возвращает значение заглушки
      4. часто реализуют абстрактные методы
    • Mocks
      1. "суперсет" заглушек; Можно утверждать, что определенные методы вызваны
        • ex: убедитесь, что myMockedService.getValues ​​() вызывается только один раз
      2. используется для проверки поведения тестируемого кода
      3. может не пройти тест
        • ex: убедитесь, что myMockedService.getValues ​​() был вызван один раз; проверка не пройдена, поскольку myMockedService.getValues ​​() не был вызван моим протестированным кодом
      4. часто издевается над интерфейсами
9 голосов
/ 24 августа 2018

давайте посмотрим на тестовые пары:

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

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

9 голосов
/ 08 апреля 2014

A fake - это общий термин, который можно использовать для описания заглушки или фиктивного объекта (рукописного или иного), поскольку оба они выглядят как реальный объект.

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

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

Что означает плавное выполнение теста?
Пример нижеприведенного кода:

 public void Analyze(string filename)
        {
            if(filename.Length<8)
            {
                try
                {
                    errorService.LogError("long file entered named:" + filename);
                }
                catch (Exception e)
                {
                    mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
                }
            }
        }

Вы хотите проверить mailService.SendEMail () метод,для этого вам нужно смоделировать исключение в вашем тестовом методе, поэтому вам просто нужно создать класс Fake Stub errorService для имитации этого результата, тогда ваш тестовый код сможет протестировать метод mailService.SendEMail ().Как вы видите, вам нужно смоделировать результат из другого класса External Dependency ErrorService.

7 голосов
/ 16 января 2016

Справа от бумаги Ложные роли, а не объекты , разработчики jMock:

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

Итак, основные отличия:

  • ожидания, заданные для заглушек, обычно являются общими, в то время как ожидания, заданные для заглушек, могут быть более «умными» (например, вернуть это при первом вызове, это при втором вызове и т. Д.).
  • заглушки в основном используются для настройки косвенных входов SUT , в то время как макеты могут использоваться для проверки как косвенных, так и косвенных выходы СУТ.

Подводя итог, также пытаясь рассеять путаницу из статьи Фаулера title: издевательства - это заглушки, но они не только заглушки .

4 голосов
/ 29 июня 2017

Точка зрения на тестирование заглушки и макета:

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

  • Mock также является фиктивной реализацией, но ее реализация осуществляется динамическим способом с использованием Mocking Frameworks, таких как Mockito.Таким образом, мы можем обрабатывать определение условий и сервисов как динамический путь, т.е. макеты могут создаваться динамически из кода во время выполнения. Таким образом, используя mock, мы можем динамически реализовать Stubs.

...