在 WordPress 項目的開發和維護過程中,對生成的 html 代碼進行測試至關重要。然而,由于 WordPress 的動態特性,生成的 HTML 經常包含一些時間敏感或者環境依賴的值,例如 nonce、URL 等。這些值在不同的運行環境中可能不同,導致傳統的快照測試經常失敗,即使代碼邏輯本身沒有問題。為了解決這個問題,lucatume/wp-snapshot-assertions 提供了一套專門針對 WordPress 的快照測試工具。
lucatume/wp-snapshot-assertions 基于 Spatie 的 phpunit-snapshot-assertions 包,專門為 WordPress 環境定制,它提供了一個 WPHtmlOutputDriver,可以幫助我們忽略 HTML 中那些時間敏感或者環境依賴的差異,從而使得快照測試更加穩定可靠。
安裝
使用 composer 安裝非常簡單:
composer require lucatume/wp-snaphot-assertions --dev
使用方法
以下是一個使用 WPHtmlOutputDriver 的例子:
use SpatieSnapshotsMatchesSnapshots; use tadWPSnapshotsWPHtmlOutputDriver; class MySnapshotTest extends CodeceptionTestCaseWPTestCase { use MatchesSnapshots; /** * Test snapshot for render */ public function test_snapshot_render() { // from some environment variable $currentWpUrl = getenv('WP_URL'); $snapshotUrl = 'http://wp.localhost'; $driver = new WPHtmlOutputDriver($currentWpUrl, $snapshotUrl); $sut = new MyPluginHTMLRenderingClass(); // create a random post and return its post ID $postId= $this->factory->post->create(); $renderedHtml = $sut->renderHtmlFor($postId); $driver->setTolerableDifferences([$postId]); $driver->setTolerableDifferencesPrefixes(['post_', 'post-']); $driver->setTolerableDifferencesPostfixes(['-single', '-another-postfix']); $this->assertMatchesSnapshot($renderedHtml, $driver); } }
在這個例子中,我們首先創建了一個 WPHtmlOutputDriver 實例,并指定了當前 WordPress 的 URL 和快照 URL。然后,我們創建了一個隨機的 post,并使用 MyPluginHTMLRenderingClass 渲染了 HTML。
為了忽略 post ID 帶來的差異,我們使用了 setTolerableDifferences 方法,將 post ID 添加到可容忍的差異列表中。此外,我們還使用了 setTolerableDifferencesPrefixes 和 setTolerableDifferencesPostfixes 方法,指定了 post ID 的前綴和后綴,以便忽略更多由 post ID 引起的差異。
主要功能
- 時間敏感字段處理: 默認情況下,WPHtmlOutputDriver 會查找一些時間敏感的字段,例如 _wpnonce,并忽略它們帶來的差異。你可以使用 setTimeDependentKeys 方法自定義這些字段。
- URL 替換: WPHtmlOutputDriver 會自動將快照 URL 替換為當前 WordPress 的 URL。你可以使用 setUrlAttributes 方法自定義需要替換的屬性。
- 可容忍差異: 使用 setTolerableDifferences 方法可以指定哪些值不應該觸發快照測試失敗。
- 可容忍差異前綴和后綴: 使用 setTolerableDifferencesPrefixes 和 setTolerableDifferencesPostfixes 方法可以指定可容忍差異的前綴和后綴。
- 屬性排除: 使用 setTimeDependentAttributes 方法可以完全排除某些屬性的比較。
優勢
- 提高測試穩定性: 通過忽略時間敏感和環境依賴的差異,lucatume/wp-snapshot-assertions 可以提高 WordPress 代碼的快照測試的穩定性。
- 簡化測試代碼: WPHtmlOutputDriver 提供了許多方便的方法,可以簡化快照測試的代碼。
- 易于集成: lucatume/wp-snapshot-assertions 可以輕松地集成到現有的 WordPress 項目中。
實際應用
lucatume/wp-snapshot-assertions 非常適合以下場景:
- 測試 WordPress 主題和插件生成的 HTML 輸出。
- 測試 WordPress REST API 的響應。
- 測試 WordPress 管理界面的渲染。
通過使用 lucatume/wp-snapshot-assertions,我們可以更加自信地進行 WordPress 代碼的修改和重構,因為我們可以通過快照測試來確保代碼的輸出沒有發生意外的變化。