當前位置: 首頁> 最新文章列表> 在PHPUnit 中模擬不同回調對比的情況

在PHPUnit 中模擬不同回調對比的情況

M66 2025-05-17

在單元測試中,有時我們需要測試在不同回調函數作用下的集合操作。 PHPUnit 提供了豐富的工具來模擬和驗證函數的行為,尤其是在處理數組或集合時,經常需要通過自定義回調來進行鍵名的比較。這篇文章將展示如何在PHPUnit 中模擬不同的回調函數,來實現鍵名比較的場景。

1. 問題背景

假設我們有一個數組,裡面的鍵是隨機的,可能代表一些不規則的數據。我們需要對這些數組進行排序,但排序的規則並非直接比較鍵的大小,而是使用不同的回調函數來動態指定比較邏輯。

例如,我們可能想要按照鍵名的字母順序來排序,或者按照鍵名的長度來排序,甚至根據某些特定的業務規則來決定排序順序。

2. 使用PHPUnit 測試回調函數

為了測試這個功能,我們可以模擬一個回調函數,在PHPUnit 中驗證這個回調是否按照預期的方式對鍵名進行比較。

假設我們有如下的PHP 函數:

 function customSort(array $array, callable $callback): array {
    uksort($array, $callback);
    return $array;
}

這個函數接收一個數組和一個回調函數作為參數, uksort()會根據回調函數對數組的鍵進行排序。接下來,我們將編寫一個PHPUnit 測試,模擬不同的回調函數。

3. 編寫PHPUnit 測試

在PHPUnit 測試中,我們可以使用createMock()callback()方法來模擬不同的回調函數。以下是如何模擬不同回調並測試customSort()函數的示例。

 use PHPUnit\Framework\TestCase;

class CustomSortTest extends TestCase {

    public function testSortByLength() {
        $array = [
            'apple' => 'fruit',
            'banana' => 'fruit',
            'kiwi' => 'fruit',
            'grape' => 'fruit',
        ];

        // 模擬按鍵名長度排序的回調函數
        $callback = function($a, $b) {
            return strlen($a) - strlen($b);
        };

        $sortedArray = customSort($array, $callback);

        $this->assertEquals(['kiwi' => 'fruit', 'apple' => 'fruit', 'grape' => 'fruit', 'banana' => 'fruit'], array_keys($sortedArray));
    }

    public function testSortAlphabetically() {
        $array = [
            'apple' => 'fruit',
            'banana' => 'fruit',
            'kiwi' => 'fruit',
            'grape' => 'fruit',
        ];

        // 模擬按字母順序排序的回調函數
        $callback = function($a, $b) {
            return strcmp($a, $b);
        };

        $sortedArray = customSort($array, $callback);

        $this->assertEquals(['apple' => 'fruit', 'banana' => 'fruit', 'grape' => 'fruit', 'kiwi' => 'fruit'], array_keys($sortedArray));
    }

    public function testSortByCustomLogic() {
        $array = [
            'apple' => 'fruit',
            'banana' => 'fruit',
            'kiwi' => 'fruit',
            'grape' => 'fruit',
        ];

        // 模擬按字母逆序排序的回調函數
        $callback = function($a, $b) {
            return strcmp($b, $a);
        };

        $sortedArray = customSort($array, $callback);

        $this->assertEquals(['kiwi' => 'fruit', 'grape' => 'fruit', 'banana' => 'fruit', 'apple' => 'fruit'], array_keys($sortedArray));
    }
}

在這個示例中,我們編寫了三個測試用例,每個用例都模擬了不同的回調函數來測試數組的排序:

  1. testSortByLength :按鍵名的長度進行排序。

  2. testSortAlphabetically :按字母順序排序。

  3. testSortByCustomLogic :使用自定義的比較邏輯(如逆序排序)。

4. 運行PHPUnit 測試

我們可以通過PHPUnit 命令行工具來運行這些測試:

 php vendor/bin/phpunit tests/CustomSortTest.php

如果一切順利,所有的測試都會通過,表示我們在不同的回調函數下正確地比較了鍵名。

5. 小結

本文展示瞭如何在PHPUnit 中模擬不同的回調函數來進行鍵名比較。通過使用uksort()callable回調函數,我們能夠靈活地控制數組的排序方式,並使用PHPUnit 驗證我們的排序邏輯是否按預期工作。

通過這種方法,你可以根據實際需求輕鬆地模擬不同的比較函數來實現更加複雜的數組操作和排序。