2013-06-07 3 views
1

У меня есть функция, которая проверяет, находится ли пользовательское имя файла в каталоге/opt /. Он использует realpath, поэтому пользователи не могут передать что-то вроде «../etc/passwd» из соображений безопасности.PHPUnit - функция тестирования, которая использует realpath()

function check_file_path($relative_filename) { 
    $abspath = realpath('/opt/' . $relative_filename); 
    return ($abspath && strpos($abspath , '/opt/') === 0); 
} 

Теперь realpath вернет false, если файл не существует на fs. Когда PHPUnit запущен (на машине dev, а не на сервере), путь не существует, поэтому мы не можем сделать положительный тест.

Я посмотрел в vfsstream, но он не играет хорошо с Realpath()

org\bovigo\vfs\vfsStream::setup('home'); 
$file = org\bovigo\vfs\vfsStream::url('home/test.txt'); 
file_put_contents($file, "The new contents of the file"); 
$abspath = realpath('vfs://home/test.txt'); 
// $abspath will be false 

Любое предложение, чтобы дразнить файловую систему так, что Realpath будет работать?

ответ

1
  1. Вы можете использовать runkit. Это расширение php.

  2. Но если ваша функция вызывает внутри любого пространства имен, вы можете определить свою собственную функцию в этом пространстве имен.

+1

https://github.com/php-test-helpers/php-test-helpers для нестандартного расширения, которое использует runkit. Имеет пример переименования функции – qrazi

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