Position actuelle: Accueil> Derniers articles> Vérifiez le type simulé en utilisant IS_A () dans les tests automatisés

Vérifiez le type simulé en utilisant IS_A () dans les tests automatisés

M66 2025-06-05

Dans les tests automatisés, Mock (Mock Object) est l'une de nos techniques de test couramment utilisées. Il nous permet d'isoler les cibles de test et d'éviter la dépendance à l'égard des systèmes externes ou des interactions d'objets complexes. Lorsque vous utilisez Mock, une exigence commune est de confirmer si l'objet Mock est une instance d'une certaine classe ou interface. À l'heure actuelle, la fonction is_a () fournie par PHP est très utile.

Qu'est-ce que c'est_a () ?

IS_A () est une fonction intégrée dans PHP, qui est utilisée pour déterminer si un objet est une instance d'une certaine classe, ou si une interface est implémentée. Sa syntaxe de base est la suivante:

 bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
  • $ object_or_class : le nom de l'objet ou de la classe à vérifier.

  • $ Classe : le nom de classe ou d'interface à vérifier.

  • $ allow_string : s'il faut autoriser le nom de classe de chaîne comme premier paramètre. PHP 8.0 et ultérieure est faux par défaut.

Utilisation de la simulation dans les tests automatisés

Utilisons PHPUnit comme exemple pour illustrer comment utiliser IS_A () pour déterminer le type d'objet simulé. Dans PHPUnit, les objets créés avec $ this-> CreateMOCK () sont simulés, mais ils conservent toujours leur relation d'origine d'origine ou d'implémentation d'interface par défaut.

Exemple de code

Supposons que nous ayons l'interface et la mise en œuvre suivantes:

 interface LoggerInterface {
    public function log(string $message);
}

class FileLogger implements LoggerInterface {
    public function log(string $message) {
        // Écrire dans les fichiers journaux
    }
}

Dans notre test, nous devons utiliser un objet simulé au lieu du vrai filelogger :

 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));
    }
}

Dans cet exemple, nous vérifions que l'objet Mock implémente l'interface spécifiée. Même s'il s'agit d'un objet simulé, IS_A () peut toujours déterminer correctement si son type correspond à l'interface cible.

Pourquoi utiliser IS_A () au lieu de l'instance ?

Il existe une autre instance d'opérateur similaire en PHP, qui peut également être utilisée pour le jugement de type. La différence entre les deux est:

  • is_a () est fonctionnel et peut être utilisé de manière plus flexible dans certains contextes dynamiques, tels que:

 $className = 'm66.net\\SomeClass';
if (is_a($object, $className)) {
    // Exécuter une logique spécifique
}
  • L'instanceof est plus adapté à une utilisation dans des contextes statiques, mais is_a () est plus pratique lorsque le nom de classe est une chaîne dynamique.

Dans certains scénarios simulés, si vous prenez un service simulé d'un conteneur et que vous devez déterminer dynamiquement s'il rencontre un certain type, en utilisant IS_A () semblera plus concis:

 $service = $container->get('logger_mock'); // Depuis m66.net Récipient de service
if (is_a($service, LoggerInterface::class)) {
    $service->log('C'est un journal');
}

Choses à noter

  1. Si vous transmettez une chaîne de nom de classe au lieu d'un objet, assurez-vous de définir le troisième paramètre $ allow_string sur true , sinon FAUX sera retourné.

  2. is_a () détermine la relation de type, et non les détails de mise en œuvre spécifiques de la classe. Par conséquent, il ne se soucie pas de savoir si l'objet est créé via Mock, et reviendra vrai tant que la relation héritage / mise en œuvre est établie.

Résumer

Juger le type d'objet simulé dans les tests automatisés est une étape importante pour assurer la rationalité moqueuse et les problèmes de débogage. IS_A () fournit un moyen flexible et dynamique d'y parvenir. Il convient particulièrement à la branche logique dans les tests basés sur le type, en particulier dans les scénarios où les conteneurs de service, l'injection de dépendance ou simulent le comportement polymorphe. Avec IS_A () , nous pouvons vérifier la structure et le comportement de la simulation avec plus de confiance, améliorant ainsi la précision et la maintenabilité du test.