Size: a a a

2019 December 31

ЕР

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

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
вот это
И?
источник

DS

Dmitry S in PHP
Bohdan Turchyk
да, Максим правильно сказал, что в идеале решение должно приниматься выше и такие штуки не должны тестироваться юнитами (т.к. там не будет логики)
почему ты считаешь что if нельзя протестировать юнитом?
источник

BT

Bohdan Turchyk in PHP
Евгений Ромашкан
С чего вдруг их не нужно юнитами покрывать?
не надо покрывать то, где нет if
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
вот это
А если бы было выше то что изменилось бы?
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
не надо покрывать то, где нет if
Ты if куда денешь?
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
не надо покрывать то, где нет if
У тебя есть какое-то магическое разделение Аля "тут иф протестирую а тут не протестирую", или что?
источник

BT

Bohdan Turchyk in PHP
давай так
источник

BT

Bohdan Turchyk in PHP
сейчас, набросаю сниппет
источник

SP

Sergey Protko in PHP
Bohdan Turchyk
привет чистые функции
public function foo(int $n) {
   $this->dependency->doSomething(range(0, $n));
}


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

$dependency->doSomething([1,2, 3, 4])->shouldBeCalled();


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

BT

Bohdan Turchyk in PHP
Sergey Protko
public function foo(int $n) {
   $this->dependency->doSomething(range(0, $n));
}


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

$dependency->doSomething([1,2, 3, 4])->shouldBeCalled();


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

SP

Sergey Protko in PHP
если ты не производишь никаких трансформаций аргументов, то простой статический анализ будет справляться с проверкой контрактов
источник

DS

Dmitry S in PHP
Sergey Protko
public function foo(int $n) {
   $this->dependency->doSomething(range(0, $n));
}


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

$dependency->doSomething([1,2, 3, 4])->shouldBeCalled();


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

DS

Dmitry S in PHP
Не знаю, было тут или нет. Есть прикольный метод быстренько подменить реализацию интерфейса
https://twitter.com/matthiasnoback/status/1179322637086003200?s=20
источник

SP

Sergey Protko in PHP
Dmitry S
что ты имеешь в виду под правильные аргументы?
class Referal {
   public string $id;
   public Referal? $parent;

   public static function invitedBy(string $userId, Referal $parent)
   {
       $referal = new self();
       $referal->id = $userId;
       $referal->parent = $parent;
       return $referal;
   }

   public function forReferalChain(CalculateFee $feeCalculator): array
   {
        $chain = [];
        $parent = $this->parent;
        while($parent && count($chain) < 5) {
             $chain[] = $parent->id;
             $parent = $parent->parent;
        }

        return $feeCalculator($chain);
   }
}

ну вот например. Простой довольно класс который хранит дерево рефералов. И тебе надо посчитать комиссию и есть ограничение мол только первые 5 уровней дерева
источник

SP

Sergey Protko in PHP
как его можно проверить? оч просто:


// precondition (цепочка рефералов на 10 человек например)

$calculateFee(['user-9', 'user-8', 'user-7', 'user-6', 'user-5'])->shouldBeCalled()->willReturn([]);

$referal->forReferalChain($calculateFee);
источник

BT

Bohdan Turchyk in PHP
Евгений Ромашкан
У тебя есть какое-то магическое разделение Аля "тут иф протестирую а тут не протестирую", или что?
сверху предлагаемый вариант, снизу второй вариант
источник

BT

Bohdan Turchyk in PHP
протестировать вариант 1 будет проще, т.к. мне в большинстве случаев не надо знать, что я вызову bar - важно только то, что оно мне вернет
источник

ЕР

Евгений Ромашкан in PHP
Bohdan Turchyk
сверху предлагаемый вариант, снизу второй вариант
Ты о каких вариантах?
источник

DS

Dmitry S in PHP
Sergey Protko
class Referal {
   public string $id;
   public Referal? $parent;

   public static function invitedBy(string $userId, Referal $parent)
   {
       $referal = new self();
       $referal->id = $userId;
       $referal->parent = $parent;
       return $referal;
   }

   public function forReferalChain(CalculateFee $feeCalculator): array
   {
        $chain = [];
        $parent = $this->parent;
        while($parent && count($chain) < 5) {
             $chain[] = $parent->id;
             $parent = $parent->parent;
        }

        return $feeCalculator($chain);
   }
}

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