UnitTest中成功したのにも関わらず以下のエラーが出てきて失敗
一部のコードです。最後まで問題なく成功したのにも関わらず以下のエラーが出て失敗しました。
「PHPUnit_Framework_Error_Notice : ob_end_clean(): failed to delete buffer. No buffer to delete」
以下のdownloadをテストしたいと思いました。
controller
public function download() {
$this->autoRender = false;
$id = $this->request->params['pass']['0'];
$info = $this->XXXX->find('first', ['conditions' => ['id' => $id, 'is_deleted' => 0]]);
$this->response->header(['Content-type: application/pdf', 'file: ファイル名']);
$this->response->file(ファイルパス);
}
unittest
$this->controller->XXXX= $this->getMockForModel('XXXX', ['find']);
$this->controller->XXXX->expects($this->once())->method('find')->will($this->returnValue($info));
$this->testAction('/XXXX/download/123', ['method' => 'get']);
$file =$this->headers['file'];
$contentType =$this->headers['Content-type'];
$fileLength =$this->headers['Content-Length'];
$this->assertEqual($file, ファイル名);
$this->assertEqual($contentType, 'application/pdf');
$this->assertEqual($fileLength, 60079);
同じエラーが発生する場合以下のようにコードを追加すれば解決できます。
unittest
$this->controller->XXXX= $this->getMockForModel('XXXX', ['download','find']);
$this->controller->XXXX->expects($this->once())->method('find')->will($this->returnValue($info));
$this->testAction('/XXXX/download/123', ['method' => 'get']);
$file =$this->headers['file'];
$contentType =$this->headers['Content-type'];
$fileLength =$this->headers['Content-Length'];
$this->assertEqual($file, ファイル名);
$this->assertEqual($contentType, 'application/pdf');
$this->assertEqual($fileLength, 60079);
//以下のコードを追加すればエラーなく成功になります。
if (ob_get_length() == 0 ) {
ob_start();
}
unitコードが問題なのかPHPUnitのバグかは調べる予定です。一応対策だけ。。。
詳細なApi説明は以下を参考にしてください。
http://php.net/manual/ja/function.ob-end-clean.php
http://php.net/manual/ja/function.ob-get-length.php
http://php.net/manual/ja/function.ob-start.php
以下の内容を参考しました。
https://github.com/sebastianbergmann/phpunit/issues/390