我是JS的新手,我需要为测试数据创建简单的CSV解析器。而且我有一个非常奇怪的问题。
这是我测试的代码:
'use strict';
const assert = require('assert');
const HomePage = require('../pages/HomePage');
const csv = require('../tools/CsvReader');
describe('Check if values are correct', () => {
let dataProvider = csv.readFromCsv("test/resources/places.csv");
function valuesTest(city, expectedLat, expectedLong) {
it('Data must match', () => {
let searchPlace = HomePage
.open()
.findByPlaceName(city)
.getSearchPlace();
assert.strictEqual(searchPlace.getLatitude(), expectedLat);
assert.strictEqual(searchPlace.getLongtitude(), expectedLong);
console.log(dataProvider[0].CITY);
});
}
for (let i = 0; i < dataProvider.length; i++) {
valuesTest(dataProvider[i].CITY, dataProvider[i].LAT, dataProvider[i].LONG)
}
});
我的CSV阅读器的代码:
'use strict';
const csv = require('csv-parser');
const fs = require('fs');
class CsvReader {
readFromCsv(path) {
let results = [];
fs.createReadStream(path)
.pipe(csv())
.on('data', (data) => results.push(data));
return results;
}
}
module.exports = new CsvReader();
这是我的CSV:
CITY,LAT,LONG
Kyiv,50.447731,30.542721
Lviv,49.839684,24.029716
Ivano-Frankivsk,48.922634,24.711117
问题如下:为什么我可以在“ valuesTest”块中使用变量“ dataProvider”,它可以正常工作并返回CITY变量的值,但是在“ for”循环中,我无法使用它(变量“ dataProvider”,“ CITY”等在此处不可用),尽管它们位于同一块“描述”中。
答案 0 :(得分:1)
您的CSV阅读器是异步操作。我怀疑您的for循环即使在解析csv并返回值之前也已执行。尝试将for循环放入函数中,并作为回调传递给readFromCsv函数。在数据事件上调用此函数,您将在该事件上确保获得数据。
答案 1 :(得分:1)
您应该将回调传递给readFromCsv
,该回调将在createReadStream
完成时执行。您可以通过监听createReadStream
事件来确定end
的完成时间。 (例如,请参见csv-parser example code。
对于您而言,您可以执行以下操作:
readFromCsv(path, onEnd) {
let results = [];
fs.createReadStream(path)
.pipe(csv())
.on('data', (data) => results.push(data))
.on('end', () => onEnd(results));
}
csv.readFromCsv("test/resources/places.csv", function onData(data) {
for (let i = 0; i < data.length; i++) {
valuesTest(data[i].CITY, data[i].LAT, data[i].LONG);
}
});
您应该使用end
事件而不是data
事件来确定流何时完成。如果您是在第一个data
事件之后返回的,则可能无法获取所有数据。
每个数据块都会触发一次data
事件。如果您的数据中有多个“块”,则如果返回数据回调,则会将其截断。有关不同事件类型的详细信息,请参见nodeJS docs。您可能不会注意到较小的测试文件会有所不同,但是制作较大的文件会看到差异。