PHPUnitManual:10.4

From 흡혈양파의 번역工房
Jump to: navigation, search
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() 메소드를 사용한 후처리가 필요 없습니다.


Notes