Laravel Storage Fake - 删除伪造的创建文件
Laravel Storage Fake - delete faked created files
我对 Laravel 的 Storake Faker 有疑问。我很难让我的代码工作。现在可以用了,但是我不太明白Storake Faker的原理
您可以在下面看到我的工作代码的简短版本: setUp 函数创建一个 Storake 假文件和一个文件。然后将文件的路径存储到数据库中。
之后它调用存储库中的一个函数,该函数检查路径是否存在。我不允许向您展示该代码,但无论如何没关系,因为它正在运行 ;)
use WithoutMiddleware;
use DatabaseTransactions;
protected $file;
protected function setUp(): void
{
parent::setUp();
$path = 'protocols';
Storage::fake($path);
$this->file = UploadedFile::fake()->createWithContent(
'protocol.html',
'Import gestartet am: 03.09.2019 10:54:13'
)->store($path);
factory(Protocol::class)->create([
'partner_id' => 1,
'user_id' => 1,
'path' => $this->file
]);
}
/** @test */
public function path_exists()
{
//Called function returns true
$path_exists = functionCall('protocols/Test.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test2.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test3.pdf');
$this->assertTrue($path_exists);
}
/** @test */
public function path_does_not_exist()
{
//Called function throws an Exception
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY.pdf');
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY2.pdf');
}
protected function tearDown(): void
{
Storage::delete($this->file);
parent::tearDown();
}
嗯,到目前为止一切顺利。但是在我测试之后我必须手动删除创建的文件,就像你在 tearDown 方法中看到的那样。
现在我们来回答我的问题。我读了很多帖子,Storage faker 不会自行删除创建的文件。但为什么不呢?我的意思是,当我必须在测试后手动删除文件时,我还创建了一个 Storage fake。真的没看懂
还是我理解有误,可以让Storage Faker自动删除文件?
编辑::解决方案:
use WithoutMiddleware;
use DatabaseTransactions;
protected $file;
protected function setUp(): void
{
parent::setUp();
$path = 'local';
Storage::fake($path);
$this->file = UploadedFile::fake()->createWithContent(
'protocol.html',
'Import gestartet am: 03.09.2019 10:54:13'
)->store($path);
factory(Protocol::class)->create([
'partner_id' => 1,
'user_id' => 1,
'path' => $this->file
]);
}
/** @test */
public function path_exists()
{
//Called function returns true
$path_exists = functionCall('protocols/Test.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test2.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test3.pdf');
$this->assertTrue($path_exists);
}
/** @test */
public function path_does_not_exist()
{
//Called function throws an Exception
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY.pdf');
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY2.pdf');
}
我将磁盘从 'protocols' 更改为 'local'。 'protocols' 只是磁盘 'local' 中的一个路径,而不是磁盘本身。
经过这个小改动后,我可以删除 tearDown 函数,因为现在它会在测试后删除创建的文件
调用Storage::fake($path);
确实会删除指定路径中的所有文件。 但是它不会在您完成测试后删除文件。但它确保在您重新 运行 时没有文件留下。
好的,我找到了故障。我是多么愚蠢 :D
我做了一个假的 'protocols'
$path = 'protocols';
Storage::fake($path);
但是我的盘不是'protocols'(只是本地的一个路径),而是'local'。所以我将这些行更改为:
$path = 'local';
Storage::fake($path);
并且我删除了 tearDown 方法。现在可以了。它会自行删除所有创建的文件,并且测试仍然是绿色的。
我对 Laravel 的 Storake Faker 有疑问。我很难让我的代码工作。现在可以用了,但是我不太明白Storake Faker的原理
您可以在下面看到我的工作代码的简短版本: setUp 函数创建一个 Storake 假文件和一个文件。然后将文件的路径存储到数据库中。
之后它调用存储库中的一个函数,该函数检查路径是否存在。我不允许向您展示该代码,但无论如何没关系,因为它正在运行 ;)
use WithoutMiddleware;
use DatabaseTransactions;
protected $file;
protected function setUp(): void
{
parent::setUp();
$path = 'protocols';
Storage::fake($path);
$this->file = UploadedFile::fake()->createWithContent(
'protocol.html',
'Import gestartet am: 03.09.2019 10:54:13'
)->store($path);
factory(Protocol::class)->create([
'partner_id' => 1,
'user_id' => 1,
'path' => $this->file
]);
}
/** @test */
public function path_exists()
{
//Called function returns true
$path_exists = functionCall('protocols/Test.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test2.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test3.pdf');
$this->assertTrue($path_exists);
}
/** @test */
public function path_does_not_exist()
{
//Called function throws an Exception
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY.pdf');
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY2.pdf');
}
protected function tearDown(): void
{
Storage::delete($this->file);
parent::tearDown();
}
嗯,到目前为止一切顺利。但是在我测试之后我必须手动删除创建的文件,就像你在 tearDown 方法中看到的那样。
现在我们来回答我的问题。我读了很多帖子,Storage faker 不会自行删除创建的文件。但为什么不呢?我的意思是,当我必须在测试后手动删除文件时,我还创建了一个 Storage fake。真的没看懂
还是我理解有误,可以让Storage Faker自动删除文件?
编辑::解决方案:
use WithoutMiddleware;
use DatabaseTransactions;
protected $file;
protected function setUp(): void
{
parent::setUp();
$path = 'local';
Storage::fake($path);
$this->file = UploadedFile::fake()->createWithContent(
'protocol.html',
'Import gestartet am: 03.09.2019 10:54:13'
)->store($path);
factory(Protocol::class)->create([
'partner_id' => 1,
'user_id' => 1,
'path' => $this->file
]);
}
/** @test */
public function path_exists()
{
//Called function returns true
$path_exists = functionCall('protocols/Test.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test2.pdf');
$this->assertTrue($path_exists);
$path_exists = functionCall('protocols/Test3.pdf');
$this->assertTrue($path_exists);
}
/** @test */
public function path_does_not_exist()
{
//Called function throws an Exception
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY.pdf');
$this->expectException(Exception::class);
$this->expectExceptionMessage('file_not_found');
$path_exists = functionCall('protocols/XY2.pdf');
}
我将磁盘从 'protocols' 更改为 'local'。 'protocols' 只是磁盘 'local' 中的一个路径,而不是磁盘本身。
经过这个小改动后,我可以删除 tearDown 函数,因为现在它会在测试后删除创建的文件
调用Storage::fake($path);
确实会删除指定路径中的所有文件。 但是它不会在您完成测试后删除文件。但它确保在您重新 运行 时没有文件留下。
好的,我找到了故障。我是多么愚蠢 :D
我做了一个假的 'protocols'
$path = 'protocols';
Storage::fake($path);
但是我的盘不是'protocols'(只是本地的一个路径),而是'local'。所以我将这些行更改为:
$path = 'local';
Storage::fake($path);
并且我删除了 tearDown 方法。现在可以了。它会自行删除所有创建的文件,并且测试仍然是绿色的。