PHPUnitManual:10.4
Revision as of 13:30, 2 July 2013 by Onionmixer (talk | contribs) (PHPUnit 10.4 파일 시스템의 mock 페이지 추가)
- 10.4 파일 시스템의 mock
vfsStream[1] 은 가상 파일 시스템[2]용의 stream wrapper[3] 로, 단위 테스트에서 실제 파일 시스템의 mock 를 생성할 때 유용합니다.
vfsStream 을 인스톨하기 위해서, 로컬 PEAR 환경에 배포 PEAR 채널 (pear.bovigo.org) 을 등록해야 합니다.
localhost# pear channel-discover pear.bovigo.org
이 작업은 최초 한 번만 실행하면 됩니다. 이제 PEAR 인스톨러를 사용하여 vfsStream 을 인스톨할 수 있게 되었습니다.
pear install bovigo/vfsStream-beta
예10.17 "파일 시스템을 조작하는 클래스" 는 파일 시스템을 조작하는 시스템의 예입니다.
예10.17 파일 시스템을 조작하는 클래스
<?php
class Example
{
protected $id;
protected $directory;
public function __construct($id)
{
$this->id = $id;
}
public function setDirectory($directory)
{
$this->directory = $directory . DIRECTORY_SEPARATOR . $this->id;
if (!file_exists($this->directory)) {
mkdir($this->directory, 0700, TRUE);
}
}
}?>
vfsStream 과 같은 가상 파일 시스템이 없다면, 외부에 영향을 끼치지 않고 setDirectory() 메소드를 개별적으로 테스트할 수 없습니다 ( 예10.18 파일 시스템을 조작하는 클래스의 테스트).
예10.18 파일 시스템을 조작하는 클래스의 테스트
<?php
require_once 'Example.php';
class ExampleTest extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
if (file_exists(dirname(__FILE__) . '/id')) {
rmdir(dirname(__FILE__) . '/id');
}
}
public function testDirectoryIsCreated()
{
$example = new Example('id');
$this->assertFalse(file_exists(dirname(__FILE__) . '/id'));
$example->setDirectory(dirname(__FILE__));
$this->assertTrue(file_exists(dirname(__FILE__) . '/id'));
}
protected function tearDown()
{
if (file_exists(dirname(__FILE__) . '/id')) {
rmdir(dirname(__FILE__) . '/id');
}
}
}
?>
이 방식은 다음과 같은 문제를 가지고 있습니다.
- 외부의 리소스를 사용하기 때문에 파일 시스템의 테스트가 연속성을 가지지 못 할 가능성이 있습니다. 그 결과 테스트의 결과를 신용할 수 없어집니다.
- setUp() 과 tearDown() 메소드를 통해 테스트 전후에 해당 디렉토리가 존재하지 않음을 확인해야 합니다.
- tearDown() 메소드를 실행하기 전에 테스트가 중단된 경우, 파일 시스템에 디렉토리가 남게 됩니다.
예10.19 "파일 시스템을 조작하는 클래스의 테스트에 필요한 파일 시스템의 mock 생성" 은 vfsStream 을 사용하여 파일 시스템의 mock 를 생성하여 파일 시스템을 조작하는 클래스를 테스트하는 예입니다.
예10.19 파일 시스템을 조작하는 클래스의 테스트에 필요한 파일 시스템의 mock 생성
<?php
require_once 'vfsStream/vfsStream.php';
require_once 'Example.php';
class ExampleTest extends PHPUnit_Framework_TestCase
{
public function setUp()
{
vfsStreamWrapper::register();
vfsStreamWrapper::setRoot(new vfsStreamDirectory('exampleDir'));
}
public function testDirectoryIsCreated()
{
$example = new Example('id');
$this->assertFalse(vfsStreamWrapper::getRoot()->hasChild('id'));
$example->setDirectory(vfsStream::url('exampleDir'));
$this->assertTrue(vfsStreamWrapper::getRoot()->hasChild('id'));
}
}
?>
이 방식은 다음과 같은 이점을 가집니다.
- 테스트가 간결해집니다.
- vfsStream 을 준비하는 테스트 대상 코드가 조작하는 파일 시스템 환경을 개발자는 자유롭게 사용할 수 있습니다.
- 실제 파일 시스템을 조작하지 않기 때문에, tearDown() 메소드를 사용한 후처리가 필요 없습니다.