자동화 된 테스트에서 Mock (Mock Object)은 일반적으로 사용되는 테스트 기술 중 하나입니다. 테스트 목표를 분리하고 외부 시스템 또는 복잡한 객체 상호 작용에 대한 의존성을 피할 수 있습니다. 모의를 사용하는 경우 일반적인 요구 사항은 모의 객체가 특정 클래스 또는 인터페이스의 인스턴스인지 확인하는 것입니다. 현재 PHP가 제공하는 IS_A () 함수는 매우 유용합니다.
IS_A () 는 PHP의 내장 기능으로, 객체가 특정 클래스의 인스턴스인지 또는 인터페이스가 구현되는지 여부를 결정하는 데 사용됩니다. 기본 구문은 다음과 같습니다.
bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class : 확인할 객체 또는 클래스 이름입니다.
$ 클래스 : 확인할 클래스 또는 인터페이스 이름입니다.
$ allow_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) {
// 로그 파일에 쓰십시오
}
}
테스트에서는 실제 fillegger 대신 모의 개체를 사용해야합니다.
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));
}
}
이 예에서는 모의 객체가 지정된 인터페이스를 구현하는지 확인합니다. Mock 객체이더라도 IS_A () 는 유형이 대상 인터페이스와 일치하는지 여부를 올바르게 결정할 수 있습니다.
PHP에는 유형의 판단에도 사용할 수있는 또 다른 유사한 연산자 인스턴스가 있습니다. 이 둘의 차이점은 다음과 같습니다.
IS_A () 는 기능적이며 다음과 같은 일부 동적 상황에서보다 유연하게 사용될 수 있습니다.
$className = 'm66.net\\SomeClass';
if (is_a($object, $className)) {
// 특정 논리를 실행하십시오
}
인스턴스는 정적 컨텍스트에서 사용하기에 더 적합하지만 클래스 이름이 동적 문자열 인 경우 IS_A ()가 더 편리합니다.
일부 모의 시나리오에서는 컨테이너에서 모의 서비스를 취하고 특정 유형을 충족하는지 동적으로 결정 해야하는 경우 IS_A ()를 사용하여 더 간결하게 나타납니다.
$service = $container->get('logger_mock'); // 에서 m66.net 서비스 컨테이너
if (is_a($service, LoggerInterface::class)) {
$service->log('이것은 로그입니다');
}
객체 대신 클래스 이름 문자열을 전달하는 경우 세 번째 매개 변수 $ allow_string을 true 로 설정하십시오. 그렇지 않으면 False가 반환됩니다.
IS_A ()는 클래스의 특정 구현 세부 사항이 아니라 유형 관계를 결정합니다. 따라서, 객체가 모의를 통해 생성되는지 여부는 신경 쓰지 않으며 상속/구현 관계가 설정되는 한 TRUE를 반환합니다.
자동화 된 테스트에서 모의 객체 유형을 판단하는 것은 모의 합리성 및 디버깅 문제를 보장하는 중요한 단계입니다. IS_A ()는 이를 달성하는 유연하고 역동적 인 방법을 제공합니다. 특히 서비스 컨테이너, 종속성 주입 또는 다형성 행동을 시뮬레이션하는 시나리오에서 유형을 기반으로 테스트에서 논리적 분기에 특히 적합합니다. IS_A ()를 사용하면 자신감을 가지고 모의의 구조와 동작을 검증하여 테스트의 정확성과 유지 가능성을 향상시킬 수 있습니다.