Тестовый метод PHPUnit вызывается один раз с каждым аргументом - PullRequest
0 голосов
/ 28 января 2020

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

Тест

$dirs = [
    "$parentDir/$siteName/assets/components",
    "$parentDir/$siteName/assets/layouts",
];

// iterate each directory 
foreach($dirs as $dir) {

    // and verify that mkdir was called with that argument only once
    $fileSystemMock->expects($this->once())
        ->method('mkdir')
        ->with($this->equalTo($dir));
}

Тестируемый метод

public function createSite($siteName) {

    $fileSystem = $this->fileSystem;
    $parentDir = $this->parentDir;

    $componentsDir = "$parentDir/$siteName/assets/components";
    $layoutsDir = "$parentDir/$siteName/assets/layouts";
    $mediaDir = "$parentDir/$siteName/content/media";
    $sectionsDir = "$parentDir/$siteName/assets/sections";

    if (!$fileSystem->exists($componentsDir)) {
        $fileSystem->mkdir($componentsDir);
    }

    if (!$fileSystem->exists($layoutsDir)) {
        $fileSystem->mkdir($layoutsDir);
    }

Однако, тест не пройден:

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'/path/to/parent/best-widgets/assets/layouts'
+'/path/to/parent/best-widgets/assets/components'

Надеюсь, имеет смысл то, что я пытаюсь. Разве в одном () не учитывается аргумент с ()? Я не знаю, как просто проверить, что метод вызывался один раз с каждым аргументом

1 Ответ

0 голосов
/ 28 января 2020

Вы можете использовать withConsecutive:

$fileSystemMock->expects($this->exactly(count($dirs)))
  ->method('mkdir')
  ->withConsecutive(...array_map(function (string $dir) { 
     return [$this->equalTo($dir)]; 
  }, $dirs));

withConsecutive ожидает один параметр для каждого набора ожиданий аргумента, поэтому array_map в сочетании с оператором распаковки пригодится.

Обратите внимание, что это должно пройти, только если вызовы выполняются в том же порядке, который определен массивом $dirs. Кажется, что немного сложнее справиться с этим (кстати, недавно была создана проблема GitHub об этом).

Бонус PHP 7.4 версия выше:

$fileSystemMock->expects($this->exactly(count($dirs)))
  ->method('mkdir')
  ->withConsecutive(...array_map(fn(string $dir) => [$this->equalTo($dir)], $dirs));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...