drupal-unit について
Drupal の実行時サービスに依存しないロジックをテストする PHP 開発者向けのユニットテスト資料です。PHPUnit のモック例と、モジュールテストの実行コマンドを紹介します。
主な機能
- 01純粋な PHP ロジックのテスト対象判定
- 02PHPUnit のモック例
- 03Drupal 翻訳のモック
- 04ロガーの期待値設定
- 05モジュールテストの実行コマンド
活用シーン
- 01ユーティリティ関数やデータ変換のテスト
- 02依存関係をモックしたクラスのテスト
- 03想定したログメッセージの確認
- 04単一モジュールのユニットテスト実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ edutrul/ drupal-ai --skill drupal-unitインストール後、Claude Code で/drupal-unitを入力して読み込まれたか確認します。
同梱ファイルREADME.md
詳細
Drupal のユニットテスト
使用する場面
- Drupal に依存しない純粋な PHP ロジック
- ユーティリティ関数、データ変換、値オブジェクト
- すべての依存関係をモックできるクラス
基本構成
// tests/src/Unit/MyServiceTest.php
namespace Drupal\Tests\my_module\Unit;
use Drupal\Tests\UnitTestCase;
use Drupal\my_module\Service\MyService;
use Psr\Log\LoggerInterface;
/**
* @coversDefaultClass \Drupal\my_module\Service\MyService
* @group my_module
*/
final class MyServiceTest extends UnitTestCase {
private MyService $service;
protected function setUp(): void {
parent::setUp();
$logger = $this->createMock(LoggerInterface::class);
$this->service = new MyService($logger);
}
/**
* @covers ::processData
*/
public function testProcessData(): void {
$input = ['foo' => 'bar'];
$result = $this->service->processData($input);
$this->assertArrayHasKey('processed', $result);
$this->assertTrue($result['processed']);
}
/**
* @covers ::processData
*/
public function testProcessDataWithEmptyInput(): void {
$this->expectException(\InvalidArgumentException::class);
$this->service->processData([]);
}
}
PHPUnit でのモック
// Mock a simple interface
$mock = $this->createMock(SomeInterface::class);
$mock->method('someMethod')->willReturn('value');
// Mock with argument matching
$mock->expects($this->once())
->method('someMethod')
->with($this->equalTo('expected-arg'))
->willReturn('result');
// Mock throwing exception
$mock->method('someMethod')->willThrowException(new \RuntimeException('Error'));
// Stub multiple calls
$mock->method('someMethod')
->willReturnMap([
['arg1', 'result1'],
['arg2', 'result2'],
]);
Drupal の翻訳(t())のモック
// UnitTestCase provides getStringTranslationStub()
$this->service = new MyService(
$this->getStringTranslationStub()
);
ロガーのモック
// Expect a specific log message
$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->once())
->method('error')
->with($this->stringContains('Failed to process'));
テストの実行
例では、docroot/ をベースとする Drupal プロジェクトを想定しています。プロジェクトで web/ や別のドキュメントルートを使用している場合は、それに応じてパスを調整してください。
# Run specific test file
ddev exec vendor/bin/phpunit docroot/modules/custom/my_module/tests/src/Unit/MyServiceTest.php
# Run all unit tests for a module
ddev exec vendor/bin/phpunit docroot/modules/custom/my_module/tests/src/Unit/
# Run with verbose output
ddev exec vendor/bin/phpunit --verbose docroot/modules/custom/my_module/tests/
コメント
Markdown 対応