node.js - 摩卡前功能无法正常工作
问题描述
我试图在我的before
钩子中读取一个 csv 文件,但由于某种原因,它在测试本身之后被执行。
let csvPath = path.join(__dirname, '/sample-conv.csv')
let messages = []
// read csv and push rows into an array
before(done => {
fs.createReadStream(csvPath).pipe(csv.parse({ headers: true })).on('data', row => {
messages.push(row)
}).on('end', () => {
console.log('before', messages) // this logs the full array correctly
done()
})
})
describe('Should return correct responses', () => {
let hardCoded = ['Hi', 'This is a response'] // hard codes responses to stub chatbot
console.log('after', messages) // logs empty array
it('dummy', done => {
expect(true).eq(true);
done()
})
// messages.forEach((row, i) => {
// it('Should return expected response for message #' + (i + 1), done => {
// const { send, expected } = row
// let actual = hardCoded[i]
// expect(actual).to.equal(expected)
// done()
// })
// })
})
还有一个问题是注释掉的it
函数根本没有执行。我添加了虚拟测试只是为了先解决before
问题。我假设它由于循环而不起作用。
解决方案
mocha
运行周期概述
:
- 加载测试文件时,Mocha 会执行其所有套件并在其中找到(但不执行)任何钩子和测试。
- 任何“首先”钩子(对于根套件,这只发生一次;请参阅根钩子插件)
每次调用都会describe()
立即执行其回调。但是,调用it
记录测试以供以后执行。Mocha 在执行此操作时会发现您的测试,但不会立即执行它们。在这个时间点,之前的钩子还没有被执行。这就是为什么console.log('after', messages)
记录空数组的原因。
简单来说,执行顺序是:describe()
及其回调=>before
钩子=>it()
例如
const { expect } = require('chai');
let messages = [];
before((done) => {
// simulate read csv operator
setTimeout(() => {
messages.push(...[1, 2, 3]);
console.log(`[${new Date().toISOString()}] before`, messages);
done();
}, 1000);
});
describe('Should return correct responses', () => {
console.log(`[${new Date().toISOString()}] after`, messages);
it('dummy', () => {
console.log(`[${new Date().toISOString()}] run dummy test case`);
expect(messages).to.be.deep.eq([1, 2, 3]);
});
});
测试结果:
[2020-12-25T05:31:45.066Z] after []
[2020-12-25T05:31:46.073Z] before [ 1, 2, 3 ]
Should return correct responses
[2020-12-25T05:31:46.075Z] run dummy test case
✓ dummy
1 passing (1s)
推荐阅读
- batch-file - 从批处理文件中的日期提取月份和年份
- protocol-buffers - Hyperledger Sawtooth 中 protobuf 中的 encode 和 create 函数有什么区别?
- android - 如何从通知中删除操作按钮?
- json - 如何更正 JsonResponse 给出的格式
- python-3.x - 尝试使用队列在 cassandra python 中插入值
- php - docker中的php Curl冲突CURLOPT_FILE和CURLOPT_RETURNTRANSFER
- ios - 在我的游戏中保持触球延迟?UIGestureEnvironmentSortAndSendDelayedTouches?
- php - 使用 Infection 进行突变测试时,phpdbg 达到内存限制
- python - 解析和处理 Azure 表存储的 HTML 表
- c - 用“return”或“do_exit()”终止内核线程是一个好习惯吗?