PHP セッションを操作および管理するための API を提供するモジュールを実装しています。Session\Manager
ユーザーがセッションを開始したり、ID を設定したり、ID を取得したり、セッションを破棄したりできるようにする実装をテストしています。PHPUnit の@runInSeparateProcess
アノテーションを使用して、このクラスのメソッドを別のプロセスでテストしています。このアノテーションを使用すると、非シリアル化エラーが原因で PHPUnit によって例外がスローされます。注釈を使用しないと、テストは期待どおりに実行され、null が false に等しくない場合に失敗します。
エラーの原因となったテストは次のとおりです。これまでのところ、実装の詳細は作成されていません。インターフェイスのすべてのメソッドが存在しますが、操作は実行されません。
class ManagerTest extends PHPUnitTestCase {
/**
* Ensures that if the session has not been started yet the sessionExists
* method returns false.
*
* @runInSeparateProcess
*/
public function testSessionExistsWhenSessionHasNotBeenStarted() {
$Manager = new \Session\Manager();
$this->assertFalse($Manager->sessionExists());
}
}
PHPUnit_Util_PHP::runJob()
問題を次の方法までたどることができました。PHPUnit 3.7.5 を実行しており、runJob
呼び出されるメソッドは次のとおりです。
/**
* Runs a single job (PHP code) using a separate PHP process.
*
* @param string $job
* @param PHPUnit_Framework_TestCase $test
* @param PHPUnit_Framework_TestResult $result
* @return array|null
* @throws PHPUnit_Framework_Exception
*/
public function runJob($job, PHPUnit_Framework_Test $test = NULL, PHPUnit_Framework_TestResult $result = NULL)
{
$process = proc_open(
$this->getPhpBinary(),
array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
),
$pipes
);
if (!is_resource($process)) {
throw new PHPUnit_Framework_Exception(
'Unable to create process for process isolation.'
);
}
if ($result !== NULL) {
$result->startTest($test);
}
$this->process($pipes[0], $job);
fclose($pipes[0]);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($process);
$this->cleanup();
if ($result !== NULL) {
$this->processChildResult($test, $result, $stdout, $stderr);
} else {
return array('stdout' => $stdout, 'stderr' => $stderr);
}
}
この行は、 の長い文字列と等しくなり$stdout = stream_get_contents($pipes[1]);
ます。の値はシリアル化されておらず、この関数に無効な値が渡されると警告がトリガーされ、例外がスローされます。の戻り値が であることも確認できました。$stdout
?
$this->processChildResult
$stdout
$this->getPhpBinary()
/usr/bin/php
スローされる例外メッセージ:
PHPUnit_Framework_Exception: ???...???"*???...??
Caused by
ErrorException: unserialize(): Error at offset 0 of 10081 bytes
hek2mgl のおかげで、 $job の var_dump の出力を保持するこの要点で$job
PHP コードを確認できます。かなりの量のコードであり、この質問はすでにかなり長いため、リンクを作成しました。
この特定のドメインに関する知識は限界に達しており、この問題をさらにデバッグする方法がわかりません。@runInSeparateProcess
が失敗する理由と$stdout
、別のプロセスを実行すると ? の長い文字列が表示される理由がわかりません。マーク。この問題の原因は何ですか?どうすれば解決できますか? セッションの開始と破棄がテストに影響を与えないようにするために、将来のテストでは別のプロセスで実行する必要があるため、このモジュールについては行き詰まっています。
- PHP: 5.3.15
- PHPユニット: 3.7.5
- IDE およびコマンド ライン テスト ランナーで発生したエラー