Laravel phpunit test maatwebsite / excel import

Я создал процедуру импорта 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..

    }

Мне нужен тест, чтобы убедиться, что загрузка прошла успешно и была запущена процедура импорта. Я перепробовал все, от подделки до использования хранилищ.

Я ценю любую помощь, спасибо!

Крис


person jo-chris    schedule 12.05.2020    source источник
comment
Было бы полезно поделиться тем, что вы на самом деле пробовали.   -  person apokryfos    schedule 12.05.2020
comment
о, это должно быть в моем вопросе, я обновлю его.   -  person jo-chris    schedule 12.05.2020


Ответы (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 будет работать должным образом.

Если вы хотите протестировать свой настоящий файл, вы можете создать новый _ 5_ экземпляр (связывающий базовый класс symfony, поскольку там находится конструктор).

$file = new UploadedFile(
    base_path('tests/files/myfile.xlsx'),
    'myfile.xlsx',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    null,
    true
);
person apokryfos    schedule 12.05.2020
comment
Спасибо! Я попытался подделать лист Excel, и импорт завершился успешно. Но я не могу использовать свой настоящий файл из каталога / files. - person jo-chris; 12.05.2020
comment
@ jo-chris вы можете создать новый экземпляр согласно stackoverflow.com/a/36414073/487813, но я не не вижу причин для этого. Это модульный тест, поэтому вам следует сосредоточиться только на тестируемом модуле, в данном случае на конечной точке. Я обновил свой ответ, чтобы показать правильный способ создания экземпляра этого класса. - person apokryfos; 12.05.2020