【问题标题】:Laravel phpunit test maatwebsite/excel importLaravel phpunit 测试 maatwebsite/excel 导入
【发布时间】:2020-08-28 00:30:13
【问题描述】:

我创建了一个 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>

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

...

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

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

/tests
  /files
    /myexcel.xlsx
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..

    }

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

感谢您的任何帮助,谢谢!

克里斯

【问题讨论】:

  • 分享您实际尝试过的内容会很有用。
  • 哦,那应该是我的问题,我会更新它。

标签: laravel testing phpunit maatwebsite-excel


【解决方案1】:

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

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

    Excel::fake();

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

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

}

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

如果你想用你的真实文件进行测试,你可以创建一个新的UploadedFile 实例(链接 symfony 基类,因为那是构造函数所在的位置)。

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

【讨论】:

  • 谢谢!我试图伪造一张excel表,导入成功。但我无法使用 /files 目录中的真实文件。
  • @jo-chris 您可以根据stackoverflow.com/a/36414073/487813 创建一个新实例,但我认为没有任何理由这样做。这是一个单元测试,因此您应该只关注被测试的单元,在这种情况下是端点。我已经更新了我的答案以显示实例化此类的“正确”方式
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 2019-05-20
  • 2021-10-08
  • 2016-11-23
  • 2017-11-12
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多