Задать вопрос
@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();
}
  • Вопрос задан
  • 267 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
и нужно ли это делать в юнит-тестах?


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

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

Похожие вопросы