2014-03-27 2 views
1

У меня есть метод в классе, который сканирует каталог и создает массив всех подкаталогов. Это довольно просто и отлично работает. Тем не менее, я хотел бы добавить единичный тест для этого метода, и мне сложно понять, как это сделать.PHP Модульное тестирование и издевательство файловой системы scandir()

Вот моя проблема: я могу создать виртуальную файловую систему с помощью vfsstream, и она отлично работает. Однако я не могу передать это в свой класс для создания массива. Для сканирования требуется реальный каталог. Я хочу протестировать управляемый каталог (очевидно, поэтому я точно знаю, что будет результатом каждого сканирования, чтобы я мог его протестировать). Отсканированный каталог в производстве может часто меняться.

Итак, мое единственное решение - создать в моих тестовых папках специфический поддельный каталог, прошедший проверку, передать этот путь моему сканеру, а затем проверить его на то, что я знаю, в этом поддельном каталоге. Это лучшая практика или я что-то упускаю?

Спасибо!

Вот код: Тест

function testPopulateAuto() 
{ 
    $c = new \Director\Core\Components\Components; 

    // The structure of the file system I am checking against. This is what I want to generate. 
    $check = array( 
     'TestFolder1', 
     'TestFolder2', 
    );  

    $path = dirname(__FILE__) . "/test-file-system/"; // Contains TestFolder1 and TestFolder1 
    $list = $c->generateList($path); // Scans the path and returns an array that should be identical to $check 

    $this->assertEquals($check, $list); 
} 

ответ

1

Извините, если я неправильно понял ваш вопрос, но scandir должен работать с пользовательским потоком. Пример:

$structure = array(
     'tmp' => array(
       'music' => array(
         'wawfiles' => array(
           'mp3'      => array(), 
           'hello world.waw'   => 'nice song', 
           'abc.waw'     => 'bad song', 
           'put that cookie down.waw' => 'best song ever', 
           "zed's dead baby.waw"  => 'another cool song' 
         ) 
       ) 
     ) 
); 
$vfs = vfsStream::setup('root'); 
vfsStream::create($structure, $vfs); 

$music = vfsStream::url('root/tmp/music/wawfiles'); 

var_dump(scandir($music)); 

Выход:

array(5) { 
    [0]=> 
    string(7) "abc.waw" 
    [1]=> 
    string(15) "hello world.waw" 
    [2]=> 
    string(3) "mp3" 
    [3]=> 
    string(24) "put that cookie down.waw" 
    [4]=> 
    string(19) "zed's dead baby.waw" 
} 
+1

Спасибо, я просто использовал VFSstream неправильно. Я не нашел документацию очень полезной. Еще раз спасибо! – Apollo

Смежные вопросы