Laravel Storage Fake - 删除伪造创建的文件

问题描述 投票:0回答:4

我对 Laravel 的 Storake Faker 有疑问。我很难让我的代码正常工作。现在可以了,但是我不太明白Storake Faker的原理。

您可以在下面看到我的工作代码的简短版本:setUp 函数创建一个 Storake fake 和一个文件。文件的路径随后将存储到数据库中。

之后,它调用存储库中的函数,该函数检查路径是否存在。我不允许向您展示该代码,但无论如何这并不重要,因为它正在工作;)

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自动删除文件?

编辑::解决方案:

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');
}

我将磁盘从“协议”更改为“本地”。 “协议”只是磁盘“本地”中的路径,而不是磁盘本身。

经过这个小更改,我可以删除tearDown函数,因为现在它会在测试后删除创建的文件

laravel storage faker
4个回答
0
投票

调用

Storage::fake($path);
确实会删除指定路径内的所有文件。 但是在您完成测试后它不会删除文件。但它可以确保在您重新运行它时没有留下任何文件。


0
投票
好吧,我发现失败了。我是多么愚蠢:D

我伪造了“协议”

$path = 'protocols'; Storage::fake($path);
但是我的磁盘不是“协议”(它只是本地的路径),它是“本地”。所以我将这些行更改为:

$path = 'local'; Storage::fake($path);
我删除了tearDown方法。现在可以了。它会自行删除所有创建的文件,并且测试仍然是绿色的。


0
投票
没有必要(目前,Laravel 8,PHP Unit 9)在测试结束时调用 Storage::fake() 。

测试完成后,测试文件将被删除。


0
投票
Yah 视频删除 kiya jata hai kam Singh 视频 Aakash Yadav 11500 jama kara kar 视频删除


enter code here


强调文字***

© www.soinside.com 2019 - 2024. All rights reserved.