PHP 개발에서 Session_Register_Shutdown () 함수는 세션이 닫힐 때 자동으로 실행되는 콜백 함수를 등록하는 데 사용됩니다. 이 기능은 일부 이전 버전의 PHP에 존재하지만 실제 프로젝트에서 특히 레거시 코드를 유지할 때 코드 의이 부분을 테스트 해야하는 상황을 만나면이 기능이 발생할 수 있습니다.
Session_Register_Shutdown () 자체는 PHP 세션 메커니즘에 바인딩되므로 콜백 동작을 직접 테스트하기가 어렵습니다. 이 기사는 테스트 가능한 코드 구조를 작성하고 PHP의 장치 테스트 프레임 워크를 사용하여 효과적인 테스트를 위해 Session_Register_Shutdown ()을 시뮬레이션하거나 교체하는 방법을 소개합니다.
Session_Register_Shutdown ()은 PHP 스크립트 실행 끝에 등록 된 콜백 함수를 호출합니다. 일반적인 사용법은 다음과 같습니다.
<?php
session_register_shutdown(function() {
// 세션을 닫을 때 논리 처리
file_put_contents('session_log.txt', 'Session closed at ' . date('Y-m-d H:i:s'));
});
?>
이 콜백 함수는 요청이 끝날 때 자동으로 실행되므로 테스트 환경이 직접 실행 결과를 캡처 할 수 없습니다.
실제 비즈니스 로직을 별도의 방법으로 캡슐화하는 것이 좋습니다. Session_Register_Shutdown () 은 콜백 등록 만 담당하며 테스트 중에 비즈니스 로직 메소드 만 호출됩니다.
<?php
class SessionHandler
{
public function registerShutdown()
{
session_register_shutdown([$this, 'onSessionShutdown']);
}
public function onSessionShutdown()
{
// 비즈니스 로직
file_put_contents('session_log.txt', 'Session closed at ' . date('Y-m-d H:i:s'));
}
}
?>
테스트 할 때는 registerShutdown ()을 호출하지 않지만 onsessionshutdown ()을 직접 테스트합니다.
예제 테스트는 다음과 같습니다.
<?php
use PHPUnit\Framework\TestCase;
class SessionHandlerTest extends TestCase
{
protected $handler;
protected $logFile = __DIR__ . '/session_log.txt';
protected function setUp(): void
{
$this->handler = new SessionHandler();
// 로그 파일이 존재하지 않는지 확인하십시오
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
}
public function testOnSessionShutdownCreatesLog()
{
$this->handler->onSessionShutdown();
$this->assertFileExists($this->logFile);
$content = file_get_contents($this->logFile);
$this->assertStringContainsString('Session closed at', $content);
}
protected function tearDown(): void
{
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
}
}
?>
비즈니스 로직 방법을 직접 호출함으로써 콜백 메커니즘으로 인한 테스트 복잡성을 피합니다.
테스트에서 등록 된 기능이 호출되도록하려면 기능 재정의 또는 모의 기술을 사용할 수 있지만 Session_Register_Shutdown () 은 PHP 내장 기능이므로 직접 조롱하기가 어려울 수 있습니다. 권장 대안은 다음과 같습니다.
등록 된 기능을 클로저 또는 인터페이스로 감싸는 것과 같은 대체 종속성으로 추상화하십시오.
생산 환경에서 실제 기능을 호출하고 테스트 환경에서 빈 구현으로 바꾸십시오.
예:
<?php
class SessionHandler
{
private $registerShutdownCallback;
public function __construct(callable $registerShutdownCallback = null)
{
$this->registerShutdownCallback = $registerShutdownCallback ?: 'session_register_shutdown';
}
public function registerShutdown()
{
call_user_func($this->registerShutdownCallback, [$this, 'onSessionShutdown']);
}
public function onSessionShutdown()
{
// 비즈니스 로직
}
}
?>
부작용을 피하기 위해 테스트 중에 Session_Register_Shutdown을 대체하기 위해 사용자 정의 콜백을 전달하십시오.
session_register_shutdown () 의 콜백 실행을 직접 테스트하는 것이 좋습니다.
비즈니스 로직을 분할하고 콜백 기능 본문을 개별적으로 테스트하십시오.
내장 기능 호출을 종속성 주입으로 교체하여 테스트 유연성을 향상시킵니다.
PHPUNIT 및 기타 테스트 프레임 워크를 사용하여 비즈니스 로직의 정확성을 확인하십시오.
위의 방법을 사용하여 Session_Register_Shutdown () 과 관련된 코드를 효과적으로 테스트하여 코드 품질 및 유지 보수를 개선 할 수 있습니다.
<?php
class SessionHandler
{
private $registerShutdownCallback;
public function __construct(callable $registerShutdownCallback = null)
{
$this->registerShutdownCallback = $registerShutdownCallback ?: 'session_register_shutdown';
}
public function registerShutdown()
{
call_user_func($this->registerShutdownCallback, [$this, 'onSessionShutdown']);
}
public function onSessionShutdown()
{
// 로그 쓰기를 시뮬레이션하십시오
file_put_contents('https://m66.net/session_log.txt', 'Session closed at ' . date('Y-m-d H:i:s'));
}
}
// 생산 환경 전화
$handler = new SessionHandler();
$handler->registerShutdown();
?>
<?php
use PHPUnit\Framework\TestCase;
class SessionHandlerTest extends TestCase
{
protected $handler;
protected $logFile = __DIR__ . '/session_log.txt';
protected function setUp(): void
{
$this->handler = new SessionHandler(function ($callback) {
// 시뮬레이션은 작업을 수행하지 않습니다,부작용을 피하십시오
});
if (file_exists($this->logFile)) {
unlink($this->logFile);
}
}
public function testOnSessionShutdownCreatesLog()
{
$this->handler->onSessionShutdown();
$this->assertFileExists('https://m66.net/session_log.txt');
$content = file_get_contents('https://m66.net/session_log.txt');
$this->assertStringContainsString('Session closed at', $content);
}
protected function tearDown(): void
{
if (file_exists('https://m66.net/session_log.txt')) {
unlink('https://m66.net/session_log.txt');
}
}
}
?>