自動テストでは、Mock(Mock Object)は、一般的に使用されるテスト手法の1つです。これにより、テストターゲットを分離し、外部システムまたは複雑なオブジェクトの相互作用への依存を避けることができます。モックを使用する場合、一般的な要件は、モックオブジェクトが特定のクラスまたはインターフェイスのインスタンスであるかどうかを確認することです。現時点では、PHPによって提供されるIS_A()関数は非常に便利です。
IS_A()は、PHPの組み込み関数であり、オブジェクトが特定のクラスのインスタンスであるかどうか、またはインターフェイスが実装されているかどうかを判断するために使用されます。その基本的な構文は次のとおりです。
bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class :チェックするオブジェクトまたはクラス名。
$ class :チェックするクラスまたはインターフェイス名。
$ aopt_string :文字列クラス名を最初のパラメーターとして許可するかどうか。 PHP 8.0以降はデフォルトではFalseです。
phpunitを例として使用して、is_a()を使用して模擬オブジェクトのタイプを決定する方法を説明しましょう。 phpunitでは、 $ this-> createmock()で作成されたオブジェクトがシミュレートされますが、デフォルトでは元のタイプの継承またはインターフェイスの実装関係を保持しています。
次のインターフェースと実装があるとします。
interface LoggerInterface {
public function log(string $message);
}
class FileLogger implements LoggerInterface {
public function log(string $message) {
// ログファイルに書き込みます
}
}
私たちのテストでは、実際のフィラロガーの代わりに模擬オブジェクトを使用する必要があります。
use PHPUnit\Framework\TestCase;
class SomeTest extends TestCase {
public function testLoggerMockType() {
$mockLogger = $this->createMock(LoggerInterface::class);
$this->assertTrue(is_a($mockLogger, LoggerInterface::class));
$this->assertFalse(is_a($mockLogger, FileLogger::class));
}
}
この例では、モックオブジェクトが指定されたインターフェイスを実装することを確認します。模擬オブジェクトであっても、 is_a()は、そのタイプがターゲットインターフェイスと一致するかどうかを正しく決定できます。
PHPには別の同様のオペレーターインスタンスがあり、タイプの判断にも使用できます。 2つの違いは次のとおりです。
IS_A()は機能的であり、次のような動的なコンテキストでより柔軟に使用できます。
$className = 'm66.net\\SomeClass';
if (is_a($object, $className)) {
// 特定のロジックを実行します
}
InstanceOFは静的コンテキストでの使用に適していますが、クラス名が動的な文字列である場合、IS_A()はより便利です。
いくつかの模擬シナリオでは、コンテナから模擬サービスを取り出し、特定のタイプを満たしているかどうかを動的に判断する必要がある場合、 is_a()を使用してより簡潔に表示されます。
$service = $container->get('logger_mock'); // から m66.net サービスコンテナ
if (is_a($service, LoggerInterface::class)) {
$service->log('これはログです');
}
オブジェクトの代わりにクラス名文字列を渡す場合は、3番目のパラメーター$ aopt_stringをtrueに設定するようにしてください。
IS_A()クラスの特定の実装の詳細ではなく、タイプの関係を決定します。したがって、オブジェクトがモックを介して作成されるかどうかは気にせず、継承/実装関係が確立されている限り、 trueを返します。
自動テストで模擬オブジェクトのタイプを判断することは、模擬合理性とデバッグの問題を確保するための重要なステップです。 IS_A()は、これを達成するための柔軟で動的な方法を提供します。これは、タイプに基づいたテストにおける論理的分岐、特にサービスコンテナ、依存関係噴射、または多型の挙動をシミュレートするシナリオで特に適しています。 IS_A()を使用すると、モックの構造と動作をより自信を持って検証することができ、それによりテストの精度と保守性が向上します。