1

私が作成している Laravel 5 パッケージには、特定のメソッドでStorage-facadeFileSelectorを使用するクラスがあります。

public function filterFilesOnDate($files, DateTime $date)
{
    return array_filter($files, function($file) use($date){
        return Storage::lastModified($file) < $date->getTimeStamp();
    });
}

このクラスは、(いくつかのファイルへの) パスとそのStorage::disk()コンストラクターを受け取ります。

現在、Orchestrator 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')ファイルをまったく返しません。File-facadeを使用すると必要なファイルが返されるため、パスは正しいですが、これはfilterFilesOnDate()Storage を使用するため、 -method と互換性がありません。

File-facadeを使用すると、次のエラーが生成されます。

League\Flysystem\FileNotFoundException: File not found at tests/_data/backups/ElvisPresley.zip

テストで間違ったストレージ メソッドを使用していますか、それとも Orchestra/Testbench の制限に遭遇しましたか?

4

1 に答える 1

5

わかりStorageました、ディスクがどのように機能するかを完全には理解していませんでした。

次のようなものを使用するStorage::lastModified()と、filesystem-config で指定されたデフォルトのファイルシステムが呼び出されます。

これはテストなので、構成はありません。

ファイルシステムオブジェクトを使用してStorage::disk()インスタンスを作成するためFilesystemAdapter、ストレージオブジェクトを「再作成」する必要があります。

そう:

$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 日に設定されます。

于 2015-03-19T09:07:29.363 に答える