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


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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 09:32
25000 руб./за проект
24 апр. 2024, в 09:27
13000 руб./за проект
24 апр. 2024, в 09:20
10000 руб./за проект