首页 > 解决方案 > 摩卡前功能无法正常工作

问题描述

我试图在我的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问题。我假设它由于循环而不起作用。

标签: node.jsmocha.jschai

解决方案


mocha 运行周期概述

  1. 加载测试文件时,Mocha 会执行其所有套件并在其中找到(但不执行)任何钩子和测试。
  1. 任何“首先”钩子(对于根套件,这只发生一次;请参阅根钩子插件)

每次调用都会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)

推荐阅读