【发布时间】:2020-01-22 14:14:06
【问题描述】:
我正在使用 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 = [];
}
}
});
worker 字段表明文件应该使用网络工作者进行流式传输,但我认为如果你实现 step 方法,无论如何你都是在强制执行。它可以完美地查找和解析上传的 CSV。
我的问题在于使用 Jasmine 进行测试。我用 fakeAsync 设置了我的测试,我调用了所有需要调用的东西,我什至在测试中刷新并勾选了让异步代码继续,但是当我期待一个结果时,它总是说这个方法是用 Papa 的 step 方法调用的没有被调用。我正在检查是否正在调用 addBatch 方法,但根据 Karma,它不是。
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();
}));
即使我在 step 方法中使用 console.log,它仍然会打印出来,这意味着它正在工作。
通过查看 Chrome 中的线程,当测试运行时,会在几毫秒内创建一个线程然后删除,所以我想那是爸爸。
我不知道网络工作者是否有单独的上下文?可能是因为它是在那里执行的,而不是在当前的 Karma 窗口中,所以它没有接听电话。
关于如何解决这个问题的任何想法,或任何其他测试方法?
【问题讨论】:
标签: javascript angular jasmine papaparse