Как я могу протестировать класс, который использует Storage Facade?

В пакете 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?

1

Решение

Хорошо, оказывается, я не совсем понял, как 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 дней.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]