如何在laravel 5.0中测试上传文件?

时间:2019-06-13 02:50:29

标签: php laravel phpunit

我要测试文件上传操作。

我检查了该操作的文件类型验证。它通过浏览器交互起作用,但是我尝试使用phpunit验证失败。

我确认仅接受jpg或jpeg文件。

这是我的单位代码

public function testWIthJpgImage()
{
    $_FILES = [
        'front_image' => [
            'name' => 'uitest',
            'type' => 'image/jpeg',
            'size'=> filesize(storage_path('data/uitest.jpg')),
            'error' => 0,
            'tmp_name' => storage_path('data/uitest.jpg')
        ]
    ];

    $response = $this->call('POST', '/api/test',[],[],$_FILES);
    $data = json_decode($response->getContent());
    dd($data); // here validation fail always
    $this->assertEquals(200, $response->getStatusCode());
}

如何在phpunit上正确测试文件上传?我的laravel 5.0版(旧版本)Laravel UploadFile不可用

2 个答案:

答案 0 :(得分:1)

您可以为此使用Illuminate\Http\UploadedFile Facade。

这里是我上传和存储文件的其中一个项目的示例。它还具有文件表和模型。

/** @test */
function create_new_file ()
{

    $payload = [
        'file' => UploadedFile::fake()->image('avatar.jpg')
    ];

    // act
    $response = $this->post("/api/files", $payload);

    // test
    $response->assertStatus(201);

    Storage::disk('local')->assertExists(File::first()->path);
}

别忘了

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

此外,您可以使用

Storage::fake('local');

,以不保留上载的文件(如果您像我一样使用存储)。这非常方便,因此您的测试不会在您的上载文件夹中创建一堆文件。

答案 1 :(得分:0)

我认为我的问题已解决,但是这样做很奇怪:)我同时设置了<activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize"> 和Symfony UploadedFile:<< / p>

$_FILES