mcpField
D
drupal-unit

drupal-unit

github.com/edutrulテスト・品質7351 回インストール21 週間前に更新
リポジトリ

drupal-unit について

Drupal の実行時サービスに依存しないロジックをテストする PHP 開発者向けのユニットテスト資料です。PHPUnit のモック例と、モジュールテストの実行コマンドを紹介します。

主な機能

  1. 01純粋な PHP ロジックのテスト対象判定
  2. 02PHPUnit のモック例
  3. 03Drupal 翻訳のモック
  4. 04ロガーの期待値設定
  5. 05モジュールテストの実行コマンド

活用シーン

  1. 01ユーティリティ関数やデータ変換のテスト
  2. 02依存関係をモックしたクラスのテスト
  3. 03想定したログメッセージの確認
  4. 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/

コメント