Skip to content

Instantly share code, notes, and snippets.

@fey
Created September 6, 2019 18:46
Show Gist options
  • Save fey/3c4fdd166abe12ced62c5ead9895f270 to your computer and use it in GitHub Desktop.
Save fey/3c4fdd166abe12ced62c5ead9895f270 to your computer and use it in GitHub Desktop.
Кирилл про моки и стабы
feycot:unicorn_face: 3:06 PM
Я не понимаю, чем мок от стаба отличается
Прочитал статью Фаулера. Мок - мы создаем "объект" и говорим, что его "метод" вернет "значение". А в стабе пишем класс, его метод и какое-то значение. А разница?
mshkv:ivelum: 3:07 PM
Запомни главное: Моки это не Стабы :batya:
(это все что я знаю)
feycot:unicorn_face: 3:08 PM
Это звучит как "Совы не то, чем кажутся"
Argentum 3:23 PM
Моки это более продвинутые штуки
стаб только возвращает то что ты скажешь
а мок может отслеживать сколько раз ты вызывал метод и с какими параметрами
по сути мок это надмножество стабов
freeman 4:11 PM
Почему не могу зайти phpmyadmin. Ubuntu, установил phpmyadmin, указал пароль, захожу по адресу http://127.0.1.1/phpmyadmin/ пользователь root + пароль. Ответ #1698 - Access denied for user 'root'@'localhost', mysqli_real_connect(): (HY000/1698): Access denied for user 'root'@'localhost' . Помогите плиз
6 replies
Last reply today at 4:21 PMView thread
kirill.mokevnin 4:28 PM
у моков и стабов разная семантика
они используются для разных задач
doradora 4:39 PM
joined #php.
feycot:unicorn_face: 5:20 PM
Наверное толком не пойму, пока сам не попробую то и другое. А стабы должны находиться в директории с тестами?
Argentum 5:31 PM
стаб же создается на лету пхпюнитом, как и мок
часто тестовые двойники создают в том же методе (edited)
Andrey Groza 5:32 PM
нет, похоже здесь же разговор про то, как эти штуки тестируют код, а не как создаются
что есть два подхода: проверка состояния и проверка поведения
:muscle:
1
просто как раз сейчас в процессе прочтения статьи
kirill.mokevnin 5:37 PM
Все верно. Нам не важно КАК работает код
нам важно ЧТО он сделает в конечном итоге
моки порождают хрупкие тесты, которые жестко завязаны на структуру кода
они фокусируются на проверке что код написан каким-то определенным образом
а не на том что получится в результате его работы
моки нужны крайне редко, например когда нет другого нормального способа протестировать что происходит
или когда надо явно знать как работает код, такое бывает в библиотеках или фрефмворках
например надо проверить что либа вызывает колбеки
потому что мы сами эту систему колбеков и пишем
поэтому моки там где можно без них это злое зло
feycot:unicorn_face: 5:39 PM
Ну вот на примере теста с авторизацией, там просто подменяется Socialite + его пользователь и проверяется как ведет себя контроллер, проверка на существование пользователя. Разве это не то?
kirill.mokevnin 5:39 PM
это то, но кроме этого
у тебя есть моки
которые проверяют что там было вызвано и сколько раз
эти проверки делают хуже, а не лучше
по сути все что тебе надо сделать это тупо удалить моки
и оставить стабы
Andrey Groza 5:43 PM
т.е. в статье, где написано
warehouseMock.expects(once()).method("hasInventory")
.with(eq(TALISKER),eq(50))
.will(returnValue(true));
Вот это expects(once()).method("hasInventory") -- это мы задаем, что метод должен быть вызван только один раз? и когда мы в конце вызывали warehouseMock.verify(); если метод вызыван два раза, то будет ошибка? (edited)
kirill.mokevnin 5:44 PM
да, эта штука проверяет именно то как работает код внутри
это тестирование методом белого ящика (или прозрачного)
а тестировать код нужно как черный ящик
данные на входе, результат на выходе
что внутри – без разницы
Andrey Groza 5:44 PM
а with - это что будет передавать внутрь метода hasInventory, а will что ему должно вернутся или что ожидается на возвращение? (edited)
т.е. когда мы вызываем метод hasInventory этого мока он нам всегда вернет true?
kirill.mokevnin 5:49 PM
так смотри
kirill.mokevnin 5:49 PM
warehouseMock.expects(once()).method("hasInventory")
.with(eq(TALISKER),eq(50))
.will(returnValue(true));
17 replies
Last reply today at 6:05 PMView thread
kirill.mokevnin 5:50 PM
вот это не мок это стаб
моком он станет когда в коде появится вот это: expects(once()).method("hasInventory")
то есть когда есть какие-то ожидания от его работы
проблема в том что в современной разарботке моком называют все подряд
из за этого сложн опонять о чем идет речь, более того, библиотеки используют только одно понятие: mock
так как технически (не семантически) мок и стаб выглядят одинаково
до тех пор пока вы не добавите ожидание
типа expect(…
feycot:unicorn_face: 5:51 PM
т.е. стаб - это заданное начальное и конечное значение?
kirill.mokevnin 5:51 PM
стаб это просто подмена
обычный ооп, просто инъектируем внутрь зависиомсть
другую
и все
мы не проверяем как ее используют
feycot:unicorn_face: 5:52 PM
а, пустышку, которая отдает наше заданное значение? (edited)
kirill.mokevnin 5:52 PM
почему обязательно пустышку?
это может быть сколь угодно сложный код
главное что мы просто делаем подмену в тестах
для удобства тестирования
полиморфизм все дела
feycot:unicorn_face: 5:53 PM
ну например сервис логирования, один сервис другим, так? (лог в консоли и лог куда-нибудь в файл)
kirill.mokevnin 5:53 PM
а вот когда вы хотите знать как конкретно работает код внутри, что там вызывается и сколько раз
да, верно
например был логер который слал логи на сервак
вы заменили его в тестах на тот что срет в файл (edited)
это стаб
kirill.mokevnin 5:54 PM
а вот когда вы хотите узнать что у этого логера обязательно был дернут какой-то метод с какими то параметрами и так далее (можно наворачивать что угодно)
1 reply
Today at 6:08 PMView thread
kirill.mokevnin 5:54 PM
то вы мокаете
и главное, тут появляется совсемд ругой смысл
вы тестируете именно то что мокаете, что оно используется так как вы ожидаете
sora:erlang: 5:54 PM
в java мире такие штуки называют “капторы“, которые типа следят что дернулось.
kirill.mokevnin 5:54 PM
короче стаб это когда мы что-то хотим поменять потому что оно мешает нам протестировать результат
мок это когда мы хотим протестировать как эта штука используется внутри (та которую подменяем) (edited)
как видите это абсолютно разные вещи по смыслу
в данном примере нам нужен стаб, так как эта либа нам мешает проверить результат работы кода, она лезет в сеть
а нам это не нужно
BalTun:slowpoke-3: 6:10 PM
спасибо за объяснение, становится понятно
BalTun
а как это делается? правильно я понимаю, что в стабе ожидания проверяются снаружи вызывающего стаб метода, а в моке ожидания проверяются внутри вызванного мока?
From a thread in #php | Today at 6:08 PM | View reply
jougene 8:05 PM
все напоминает воркшоп по ооп (edited)
а моков я наелся с попытками 100% покрытия
полчаса пишешь код - три часа правишь кучу упавших хрупких тестов
:heavy_plus_sign:
1
kirill.mokevnin 8:07 PM
правильно я понимаю, что в стабе ожидания проверяются снаружи вызывающего стаб метода,
стаб вообще не про проверки
он про то чтобы сделать код более тестируемым
и все
например чтобы не выполнялись реальные запросы
мы используем стаб когда хотим чтобы что-то не мешало нам тестировать что то другое
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment