Aktueller Standort: Startseite> Neueste Artikel> Überprüfen Sie den Mocktyp mit IS_A () in automatisierten Tests

Überprüfen Sie den Mocktyp mit IS_A () in automatisierten Tests

M66 2025-06-05

Bei automatisierten Tests ist Mock (Mock -Objekt) eine unserer häufig verwendeten Testtechniken. Es ermöglicht uns, Testziele zu isolieren und die Abhängigkeit von externen Systemen oder komplexen Objektwechselwirkungen zu vermeiden. Bei der Verwendung von Mock besteht eine häufige Anforderung darin, zu bestätigen, ob das Mock -Objekt eine Instanz einer bestimmten Klasse oder Schnittstelle ist. Zu diesem Zeitpunkt ist die von PHP bereitgestellte IS_A () -Funktion sehr nützlich.

Was ist is_a () ?

IS_A () ist eine integrierte Funktion in PHP, mit der festgestellt wird, ob ein Objekt eine Instanz einer bestimmten Klasse ist oder ob eine Schnittstelle implementiert ist. Die grundlegende Syntax ist wie folgt:

 bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
  • $ object_or_class : Der zu überprüfen von Objekt oder Klassenname.

  • $ Klasse : Die zu überprüfenswerte Klasse oder Schnittstellenname.

  • $ degly_string : Ob zuzulassen, ob der String -Klassenname als erster Parameter zuzulassen. PHP 8.0 und später ist standardmäßig falsch .

Verwenden von Mock in automatisierten Tests

Verwenden wir Phpunit als Beispiel, um zu veranschaulichen, wie is_a () verwendet wird, um den Typ eines Scheinobjekts zu bestimmen. In Phpunit werden Objekte, die mit $ this-> createMock () erstellt wurden, simuliert, behalten jedoch standardmäßig ihren ursprünglichen Vererbungs- oder Interface-Implementierungsbeziehung.

Beispielcode

Angenommen, wir haben die folgende Schnittstelle und Implementierung:

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

class FileLogger implements LoggerInterface {
    public function log(string $message) {
        // Schreiben Sie in Protokolldateien
    }
}

In unserem Test müssen wir ein Scheinobjekt anstelle des realen Fileloggers verwenden:

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

In diesem Beispiel überprüfen wir, dass das Scheinobjekt die angegebene Schnittstelle implementiert. Auch wenn es sich um ein Scheinobjekt handelt, kann IS_A () immer noch korrekt bestimmen, ob sein Typ mit der Zielschnittstelle übereinstimmt.

Warum is_a () anstelle von Instanz verwenden?

Es gibt eine andere ähnliche Operatorinstanz in PHP, die auch für die Typ -Beurteilung verwendet werden kann. Der Unterschied zwischen den beiden ist:

  • is_a () ist funktional und kann in einigen dynamischen Kontexten flexibler verwendet werden, wie zum Beispiel:

 $className = 'm66.net\\SomeClass';
if (is_a($object, $className)) {
    // Spezifische Logik ausführen
}
  • InstanceOF eignet sich besser für die Verwendung in statischen Kontexten, aber IS_A () ist bequemer, wenn der Klassenname eine dynamische Zeichenfolge ist.

Wenn Sie in einigen Scheinszenarien einen Scheinservice aus einem Container herausnehmen und dynamisch feststellen müssen, ob er einen bestimmten Typ erfüllt, erscheint die Verwendung von IS_A () präziser:

 $service = $container->get('logger_mock'); // Aus m66.net Service Container
if (is_a($service, LoggerInterface::class)) {
    $service->log('Dies ist ein Protokoll');
}

Dinge zu beachten

  1. Wenn Sie in einer Klassennamenzeichenfolge anstelle eines Objekts übergeben, stellen Sie sicher, dass der dritte Parameter $ degfter_string auf true festgelegt wird, ansonsten wird Falsch zurückgegeben.

  2. IS_A () bestimmt die Typbeziehung, nicht die spezifischen Implementierungsdetails der Klasse. Daher ist es egal, ob das Objekt durch Mock erstellt wird, und wird wahr zurückkehren, solange die Vererbung/Implementierungsbeziehung hergestellt wird.

Zusammenfassen

Die Beurteilung der Art des Scheinobjekts bei automatisierten Tests ist ein wichtiger Schritt, um eine Scheinrationalität und Debugging -Probleme zu gewährleisten. IS_A () bietet eine flexible, dynamische Möglichkeit, dies zu erreichen. Es eignet sich besonders für die logische Verzweigung in der Tests basierend auf dem Typ, insbesondere in Szenarien, in denen Servicebehälter, Abhängigkeitsinjektion oder simuliertes polymorphes Verhalten simulieren. Mit IS_A () können wir die Struktur und das Verhalten von Mock mit mehr Selbstvertrauen überprüfen und damit die Genauigkeit und Wartbarkeit des Tests verbessern.