[英]PHPUnit test method is called once with each argument
我有一個方法,它會在一次測試中被多次調用,但每個參數只調用一次。 所以我想測試該方法只接收每個參數一次。 例如,我在這里有一個 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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.