簡體   English   中英

PHPUnit 測試方法對每個參數調用一次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM