Модульное тестирование 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"
}
Другие вопросы по тегам