Web Workers, Жасмин и Папа Парс - PullRequest
1 голос
/ 22 января 2020

Я использую PapaParse для анализа файла CSV, переданного пользователем. Вот мой код:

this.fileToUpload = files.item(0);
this.status = Status.Loading;
let batch = [];

this.papa.parse(this.fileToUpload, {
    worker: true,
    step: (row) => {
    if (batch.length === this.pageSize) {
        this.addBatch(batch, this.offset);
        this.offset += this.pageSize;
        batch = [];
    }
    batch.push({
        id: row.data[0],
        name: row.data[1],
        address: row.data[2]
    });
    },
    complete: (result) => {
    if (batch.length > 0) {
        this.addBatch(batch, this.offset);
        batch = [];
    }
    }
});

Рабочее поле указывает, что файл должен быть передан в потоковом режиме с использованием веб-работников, но я думаю, что если вы реализуете пошаговый метод, вы все равно будете его принудительно использовать. Он отлично работает, находит и анализирует загруженный файл CSV.

Моя проблема заключается в тестировании этого с использованием Jasmine. Я настроил свой тест с помощью fakeAsyn c, я вызываю все, что нужно вызвать, я даже сбросил и поставил галочку в тесте, чтобы позволить асинхронному коду продолжаться, но когда я ожидаю результата, он всегда говорит, что метод вызывается с шагом Метод папы не назывался. Я проверяю, вызывается ли метод addBatch, но в соответствии с Кармой это не так.

  it('should upload a valid csv file', fakeAsync(() => {
    // given
    component.ngOnInit();
    spyOn(component, 'addBatch');
    const blob = new Blob(['12345,Example,FakeStreet\n54321,Example,FakeStreet'], { type: 'text/csv' });
    blob['lastModified'] = '';
    blob['name'] = 'filename.csv';
    const file = <File>blob;

    const fileList = {
      0: file,
      1: file,
      length: 2,
      item: (index: number) => file
    };
    // when
    component.addMerchants(fileList);
    flush();

    // then
    expect(component.addBatch).toHaveBeenCalled();
  }));

Даже когда я console.log в методе step, он все равно печатает, что означает он работает.

Из-за просмотра потоков в Chrome, когда тест выполняется, в течение пары миллисекунд создается поток, а затем удаляется, так что я думаю, что это папа.

Я не знаю, есть ли у веб-работников отдельный контекст? Возможно, потому что он выполняется там, а не в текущем окне Кармы, он не отвечает на вызов.

Есть какие-нибудь мысли о том, как это можно решить, или какие-либо другие подходы для проверки этого?

1 Ответ

1 голос
/ 22 января 2020

Asyn c не работает, по крайней мере, в основном потоке, поэтому NgZone не является "нестабильным". Таким образом, для всех целей и задач тест думает, что может просто вызвать метод expect.

Вы на самом деле не проводите здесь модульный тест, а скорее интеграционный тест. Если вы хотите выполнить модульный тест, вы должны смоделировать papa.parse, и ваш макет должен обработать полный вызов на основе любого ввода, который вы дадите из своего модульного теста. Вы можете сделать это asyn c, используя setTimeout, если вы действительно хотите.

...