Задать вопрос
@andriyan0v

Можно ли задать ожидание порядка выполнения методов мока в phpunit?

Добрый день,
Возможно ли задать ожидание порядка выполнения методов мока в phpunit? и нужно ли это делать в юнит-тестах?

К примеру есть тестируемый класс:
<?php

class XXX
{
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function doSomething(array $list)
    {
        $db->truncate();
        foreach ($list as $item) {
            $db->insert($item);
        }
    }
}


И тест к нему:
class XXXTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @test
     */
    public function doSomething()
    {
        $xxx = new XXX($this->createDBMock($this->getList()));

        $xxx->doSomething($this->getList())
    }

    private function createDBMock($list)
    {
        $mock = $this->createMock(DB::class);

        $mock
            ->expects($this->once())
            ->method('truncate');

        $mock
            ->expects($this->exactly(count($list)))
            ->method('save')
            ->with($list[0], $list[1]);

        return $mock;
    }

    private function getList()
    {
        return ['foo', 'bar'];
    }
}


Если в методе doSomething изменится последовательность вызова методов, то тесты не поломаются, однако сломается логика класса
public function doSomething(array $list)
{
    foreach ($list as $item) {
        $db->insert($item);
    }
    $db->truncate();
}
  • Вопрос задан
  • 268 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
и нужно ли это делать в юнит-тестах?


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

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽