PHPUnit 测试方法对每个参数调用一次



我有一个方法,在一次测试中会被多次调用,但每个参数只能调用一次。所以我想测试该方法是否只收到每个参数一次。例如,我这里有一个 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'

希望我想要的有意义。once(( 不考虑 with(( 参数吗?我不知道如何检查每个参数调用一次的方法

您可以使用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));

相关内容

最新更新