我如何测试使用 Storage Facade 的 class?
How can I test a class that uses the Storage Facade?
在我制作的 Laravel 5 包中有一个 class FileSelector
以某种方式使用 Storage-facade。
public function filterFilesOnDate($files, DateTime $date)
{
return array_filter($files, function($file) use($date){
return Storage::lastModified($file) < $date->getTimeStamp();
});
}
这个 class 接受一个路径(到一些文件)和一个 Storage::disk()
在它的构造函数中。
现在我正在尝试使用 Orchestra Testbench 为此特定 class 编写一些基本单元测试。
设置函数如下所示:
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')
returns 根本没有文件。
路径是正确的,因为使用 File-facade returns 所需的文件,但这与 filterFilesOnDate()
方法不兼容,因为它使用存储。
使用 File-facade 生成以下错误:
League\Flysystem\FileNotFoundException: File not found at tests/_data/backups/ElvisPresley.zip
我是否在测试中使用了错误的存储方法,或者我是否偶然发现了 Orchestra/Testbench 的限制?
好吧,原来我没有完全理解Storage
和磁盘是如何工作的。
使用 Storage::lastModified()
之类的东西调用文件系统配置中指定的默认文件系统。
由于这是一个测试,所以没有配置。
Storage::disk()
的作用是使用文件系统对象创建 FilesystemAdapter
的实例,因此存储对象需要 'recreated'。
所以:
$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 天。
在我制作的 Laravel 5 包中有一个 class FileSelector
以某种方式使用 Storage-facade。
public function filterFilesOnDate($files, DateTime $date)
{
return array_filter($files, function($file) use($date){
return Storage::lastModified($file) < $date->getTimeStamp();
});
}
这个 class 接受一个路径(到一些文件)和一个 Storage::disk()
在它的构造函数中。
现在我正在尝试使用 Orchestra Testbench 为此特定 class 编写一些基本单元测试。
设置函数如下所示:
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')
returns 根本没有文件。
路径是正确的,因为使用 File-facade returns 所需的文件,但这与 filterFilesOnDate()
方法不兼容,因为它使用存储。
使用 File-facade 生成以下错误:
League\Flysystem\FileNotFoundException: File not found at tests/_data/backups/ElvisPresley.zip
我是否在测试中使用了错误的存储方法,或者我是否偶然发现了 Orchestra/Testbench 的限制?
好吧,原来我没有完全理解Storage
和磁盘是如何工作的。
使用 Storage::lastModified()
之类的东西调用文件系统配置中指定的默认文件系统。
由于这是一个测试,所以没有配置。
Storage::disk()
的作用是使用文件系统对象创建 FilesystemAdapter
的实例,因此存储对象需要 'recreated'。
所以:
$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 天。