私はしばらくこの問題に巻き込まれています。なぜPHPunitが関数が呼び出されているのかわかりません。PHPunitメソッドが1回呼び出されると予想され、実際に0回呼び出されます
これは私がテストしようとしているコードです:
public function handle()
{
$path = $this->request->getPath();
$requestMethod = $this->request->getMethod();
if (!$path) {
$this->redirect('home');
} else if (!$this->isMethodPathFound($path, $requestMethod)) {
$this->redirect('404');
} else {
$handler = $this->getControllerFullName($this->routes[$path]['handler']);
if (is_callable($handler)) {
call_user_func($handler);
} else {
$this->redirect('404');
}
}
}
/**
* @param string $path
* @param int $statusCode
*/
public function redirect($path, $statusCode = 303)
{
if (defined('TESTING_ENVIRONMENT') && TESTING_ENVIRONMENT) {
return;
}
header(
'Location: ' . $this->request->getProtocol() .
$this->request->getHost() . '/' . $path,
true,
$statusCode
);
die();
}
それはPHPUnitの実行にトリガしないようにTESTING_ENVIRONMENT変数はヘッダー機能用に設定されている(私は別のクラスを作成する必要はありませんただ一つのテストのためにそれを模擬できるようにすることリダイレクト機能を持っている)、これはテストコードです:
public function testHandlePathIsEmpty()
{
$requestMock = $this->getMockBuilder('\services\Request')->getMock();
$requestMock->expects($this->once())->method('getPath')->willReturn('');
$requestMock->expects($this->once())->method('getMethod')->willReturn('GET');
$routerMock = $this->getMockBuilder('\services\Router')
->setConstructorArgs([$this->routes, $requestMock])
->enableProxyingToOriginalMethods()
->getMock();
$routerMock->expects($this->once())->method('redirect')
->with('asdasd')->willReturn(true);
$routerMock->handle();
}
$ routerMockオブジェクトは間違いなく「リダイレクト」機能を呼び出す必要があり、それはそれは取得しないことを言います私がvar_dump /関数内で死ぬときにも、それが呼び出されます。それの中に入る。
ありがとうございました!
私がルータクラスを嘲笑している理由は、リダイレクト機能を無効にし、その機能をテストしないことです。なぜなら、それはすべてPHPのグローバル関数なので、正しい場所で呼び出されるようにしたいだけです。そしてSOLIDについては、このクラスは単一の責任であり、その依存関係はそれに注入され、拡張可能であり、Liskovの置換にはかなり容易に従います。 PHPUnitでは、関数が実行されて例外がスローされることがわかりませんでした。 – Bola