Laravel phpunit 测试 maatwebsite/excel 导入

sev*_*ner 0 testing phpunit laravel maatwebsite-excel

我创建了一个 maatwebsite/excel 导入例程,我想测试它。

maatwebsite/excel 测试页面除了伪造之外没有向我提供任何其他信息。但我需要上传我的真实 Excel 文件,因为我想验证 Excel 文件中的数据是否已正确处理。

这是我的上传输入字段和用于点击端点的相应按钮/import

<form action="/import" method="post" enctype="multipart/form-data">
   @csrf
   <div class="form-group">
       <input type="file" class="form-control-file file-path" name="fileToUpload">
   </div>
   <button type="submit" class="btn btn-primary">Import File</button>
</form>
Run Code Online (Sandbox Code Playgroud)

在视图的控制器端,将处理并导入上传的文件。

...

public function store(Request $request) {
        $request->validate([
            'fileToUpload' => 'required|file|max:4096|mimes:xls,xlsx',
        ]);

        // start the import
        Excel::import(new SheetNavigator, request()->file('fileToUpload'));
...

Run Code Online (Sandbox Code Playgroud)

需要导入的文件位于我的测试环境中:

/tests
  /files
    /myexcel.xlsx
Run Code Online (Sandbox Code Playgroud)
public function test_user_can_import_file() {

        Excel::fake();

        $datafile = new UploadedFile(
            base_path('tests/files/myfile.xlsx'),
            'myfile.xlsx',
            'xlsx',
            13071,
            true);

        $res = $this->post('/import', [
            'fileToUpload' => $datafile
        ]);

        // asserting, that everything works..

    }
Run Code Online (Sandbox Code Playgroud)

我需要一个测试来验证上传是否成功以及导入例程是否已触发。我尝试了一切,从伪造任何东西到使用存储。

我感谢任何形式的帮助,谢谢!

克里斯

apo*_*fos 5

一般来说,执行此操作的理想方法是模拟该类Excel,然后检查是否import已使用给定文件调用。尽管这似乎是一个静态调用,但它实际上是一个外观调用,因此您可以将其与模拟交换。事实上,它似乎自己提供了此功能:

public function testThatItImportsTheUploadedFile() {
    $file = UploadedFile::fake()->create('myexcel.xlsx');

    Excel::fake();

    $this->post('/import', [
        'fileToUpload' => $file
    ]);

    Excel::assertImported('myexcel.xlsx');

}
Run Code Online (Sandbox Code Playgroud)

注意:这将验证端点是否按预期工作,前提是文件已上传并且Excel::import将按预期工作。

如果您想使用真实文件进行测试,您可以创建一个新UploadedFile实例(链接 symfony 基类,因为构造函数就在那里)。

$file = new UploadedFile(
    base_path('tests/files/myfile.xlsx'),
    'myfile.xlsx',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    null,
    true
);
Run Code Online (Sandbox Code Playgroud)