Size: a a a

2019 December 31

BT

Bohdan Turchyk in PHP
в варианте после // для того, чтобы протестировать функцию foo нам нужно знать, что метод someShittySideEffect был вызван (нужно повесить на него мок с проверкой количества вызовов)
тем самым мы завязываемся на реализацию функции bar

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

BT

Bohdan Turchyk in PHP
я не говорю о том, что if'ов станет меньше вообще
источник

BT

Bohdan Turchyk in PHP
я говорю только о том, что если у нас нет if в функции - ее не надо покрывать тестами (чаще всего)
источник

SP

Sergey Protko in PHP
Bohdan Turchyk
в варианте после // для того, чтобы протестировать функцию foo нам нужно знать, что метод someShittySideEffect был вызван (нужно повесить на него мок с проверкой количества вызовов)
тем самым мы завязываемся на реализацию функции bar

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

SP

Sergey Protko in PHP
$api->call(Argument::cetera())->will(function ($args) {
   $this->call(...$args)->will(function ($args) {
       $this->call(...$args)->willReturn('content');
       throw new RequestTimetout();
   });
   throw new RequestTimetout();
});

$this->makeACall()->shouldReturn('content');
источник

SP

Sergey Protko in PHP
это куда проще чем пилить "реализацию пустышку" которая нужна только для проверки этого кейса
источник

SP

Sergey Protko in PHP
при этом мы жестко изолируем контракт
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
в варианте после // для того, чтобы протестировать функцию foo нам нужно знать, что метод someShittySideEffect был вызван (нужно повесить на него мок с проверкой количества вызовов)
тем самым мы завязываемся на реализацию функции bar

в варианте до /
/ мы предполагаем, что этот метод будет вызываться всегда
и тогда мы можем совершенно спокойно замокать функцию bar, но не считать вызовы, а просто указать, что она вернет
>в варианте до // мы предполагаем, что этот метод будет вызываться всегда

И получаем ошибку потому что он вызывается не всегда?
источник

BT

Bohdan Turchyk in PHP
и еще по ходу дела сейчас возникла мысль
завязываться на реализацию при моках иногда придется
но чем "ниже" по иерархии мы это делаем - тем проще потом будет жить
в идеале мы должны завязываться на реализацию только там, где она максимально стабильна
источник

BT

Bohdan Turchyk in PHP
Евгений Ромашкан
>в варианте до // мы предполагаем, что этот метод будет вызываться всегда

И получаем ошибку потому что он вызывается не всегда?
а как он будет вызываться не всегда, если там return $baz + someShittySideEffect(); ?
источник

SP

Sergey Protko in PHP
Bohdan Turchyk
и еще по ходу дела сейчас возникла мысль
завязываться на реализацию при моках иногда придется
но чем "ниже" по иерархии мы это делаем - тем проще потом будет жить
в идеале мы должны завязываться на реализацию только там, где она максимально стабильна
именно
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
а как он будет вызываться не всегда, если там return $baz + someShittySideEffect(); ?
Это не в функции foo
источник

SP

Sergey Protko in PHP
зависимости должны быть стабильнее штуки которой они нужны. Это не только про тесты - в целом это позволяет уменьшить вероятность изменений
источник

BT

Bohdan Turchyk in PHP
Евгений Ромашкан
Это не в функции foo
я говорю о том, что в первом кейсе всегда вызываться будет не bar
а someShittySideEffect
во втором кейсе - не будет
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
я говорю о том, что в первом кейсе всегда вызываться будет не bar
а someShittySideEffect
во втором кейсе - не будет
1 вариант:
Мы пишем тест на foo() и мокаем bar()
+ могут появиться if`ы в клиентском коде

2 вариант:
Мы пишем тест на bar() и мокаем someShittySideEffect()
источник

BT

Bohdan Turchyk in PHP
Евгений Ромашкан
1 вариант:
Мы пишем тест на foo() и мокаем bar()
+ могут появиться if`ы в клиентском коде

2 вариант:
Мы пишем тест на bar() и мокаем someShittySideEffect()
ты упускаешь, что if'ы в клиентском коде будут в любом случае, т.к. булевый флаг передаем в обоих случаях
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
ты упускаешь, что if'ы в клиентском коде будут в любом случае, т.к. булевый флаг передаем в обоих случаях
Поэтому пример весьма странный
источник

ЕР

Евгений Ромашкан in PHP
источник

ЕР

Евгений Ромашкан in PHP
(имена изменены)
источник

ЕР

Евгений Ромашкан in PHP
Как протестить без мока?
источник