В пакете Laravel 5, который я делаю, есть класс FileSelector
который использует Хранение-фасад в определенном методе.
public function filterFilesOnDate($files, DateTime $date)
{
return array_filter($files, function($file) use($date){
return Storage::lastModified($file) < $date->getTimeStamp();
});
}
Этот класс принимает путь (к некоторым файлам) и Storage::disk()
в этом конструкторе.
Сейчас я пытаюсь написать несколько базовых модульных тестов для этого конкретного класса, используя Orchestra Testbench.
Функция setUp выглядит так:
protected $fileSelector;
protected $date;
public function setUp()
{
parent::setUp();
$this->date = new DateTime();
$this->fileSelector = new fileSelector('tests/_data/backups', Storage::disk('local'));
}
Неудачный тест:
public function test_if_files_are_filtered_on_date()
{
$files = Storage::allFiles('tests/_data/backups');
$filteredFiles = $this->fileSelector->filterFilesOnDate($files, $this->date);
}
Storage::allFiles('tests/_data/backups')
возвращается файлов нет совсем.
Путь правильный, потому что с помощью Файл-фасад возвращает необходимые файлы, но это не совместимо с filterFilesOnDate()
-метод, потому что он использует хранилище.
С использованием Файл-фасад генерирует следующую ошибку:
League\Flysystem\FileNotFoundException: File not found at tests/_data/backups/ElvisPresley.zip
Я неправильно использую Storage-методы в тесте или наткнулся на ограничение Orchestra / Testbench?
Хорошо, оказывается, я не совсем понял, как Storage
и диски работали.
Используя такие вещи, как Storage::lastModified()
вызывает файловую систему по умолчанию, указанную в config-файловой системы.
Поскольку это тест, нет конфигурации.
Какие Storage::disk()
делает, это создать экземпляр FilesystemAdapter
использование объекта файловой системы. Таким образом, объект Storage должен быть «воссоздан».
Так:
$this->fileSelector = new FileSelector('tests/_data/backups', Storage::disk('local'));
становится:
$this->disk = new Illuminate\Filesystem\FilesystemAdapter(
new Filesystem(new Local($this->root))
);
$this->fileSelector = new FileSelector($this->disk, $this->path);
($this->path
путь, в котором хранятся файлы, которые я использую для тестирования)
Мне также было указано, что я должен устанавливать lastModified-timestamps вручную при каждом запуске теста, чтобы избежать различий в результатах теста.
foreach (scandir($this->testFilesPath) as $file)
{
touch($this->testFilesPath . '/' . $file, time() - (60 * 60 * 24 * 5));
}
С помощью touch
Вы можете создавать файлы или устанавливать временные метки файлов. В этом случае они установлены на 5 дней.
Других решений пока нет …