PHPUnitManual:10.4

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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