在進行 php 單元測試時,我們經常需要模擬一些依賴對象,以便隔離被測試的代碼。NULL Object 是一種常用的設計模式,它提供了一個具有相同接口但什么都不做的對象,用于替代那些在特定測試場景下不需要實際功能的依賴對象。
手動創建 null object 是一項重復且繁瑣的任務。為了解決這個問題,我發現了一個非常有用的 php 庫:koriym/null-object。這個庫可以根據接口自動生成 null object,極大地簡化了單元測試的編寫過程。
koriym/null-object 的主要功能是:
- 根據接口生成 Null Object: 自動創建一個實現了指定接口的 Null Object 類。
- 支持動態創建和保存到文件: 可以動態創建 Null Object,也可以將生成的代碼保存到文件中。
- On-the-fly 模式: 通過注冊自動加載器,可以簡單地通過在接口名稱后添加 Null 后綴來創建 Null Object。
安裝
使用 composer 安裝 koriym/null-object 非常簡單:
立即學習“PHP免費學習筆記(深入)”;
composer require --dev koriym/null-object
使用示例
假設我們有以下接口:
interface FooInterface { public function doSomething(): void; public function getValue(): string; }
使用 koriym/null-object 可以這樣生成 Null Object:
use KoriymNullObjectNullObject; class MyTest extends TestCase { private NullObject $nullObject; protected function setUp(): void { $this->nullObject = new NullObject(); } public function testNullObject(): void { $nullObject = $this->nullObject->newInstance(FooInterface::class); $this->assertInstanceOf(FooInterface::class, $nullObject); $nullObject->doSomething(); // 什么都不會發生 $this->assertSame('', $nullObject->getValue()); // 返回默認值 } }
On-the-fly 模式
koriym/null-object 還提供了一種更便捷的 On-the-fly 模式。首先,需要在 composer.json 中注冊自動加載器:
"autoload-dev": { "files": ["./vendor/koriym/null-object/autoload.php"] }
然后,就可以直接通過在接口名稱后添加 Null 后綴來創建 Null Object:
$nullClass = FooInterface::class . 'Null'; $foo = new $nullClass; $this->assertInstanceOf(FooInterface::class, $foo);
總結
koriym/null-object 是一個非常實用的 PHP 庫,可以幫助我們快速生成 Null Object,從而簡化單元測試的編寫過程,提高開發效率。其 On-the-fly 模式更是方便快捷,值得在項目中嘗試使用。
優點:
- 快速生成 Null Object,減少重復代碼。
- 提高單元測試效率。
- On-the-fly 模式使用方便。
缺點:
- 不支持繼承的接口。
總的來說,koriym/null-object 是一個值得推薦的 PHP 單元測試輔助工具。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END