Node.js 在Mocha中,如何确保在运行每个测试之前完成beforeach?在一个接一个地运行之前,内部的函数是什么?

Node.js 在Mocha中,如何确保在运行每个测试之前完成beforeach?在一个接一个地运行之前,内部的函数是什么?,node.js,promise,mocha.js,Node.js,Promise,Mocha.js,在我的mocha测试中,我在运行测试之前运行了一些函数来设置db。第一个函数创建所有数据库表,如下所示:- const createDatabase = () => { return new Promise(async function (resolve, reject) { await db.serialize(async () => { db.run('DROP TABLE IF EXISTS Globals');

在我的mocha测试中,我在运行测试之前运行了一些函数来设置db。第一个函数创建所有数据库表,如下所示:-

const createDatabase = () => {
    return new Promise(async function (resolve, reject) {
        await db.serialize(async () => {
            db.run('DROP TABLE IF EXISTS Globals');
            db.run('DROP TABLE IF EXISTS checks');
            db.run('DROP TABLE IF EXISTS SalesItems');
            ...
            ...
            ...
            db.run('CREATE TABLE Globals (Id INTEGER NOT NULL PRIMARY KEY, Key TEXT NOT NULL, ValueInt INTEGER)');  
            ...
            ...
            ...
        })
        resolve();
    });
}
describe('test', function () {
    beforeEach(async function () {
        return new Promise(async function (resolve, reject) {
            createDatabase().then(() => {
                seedTestDatabase();
                resolve();
            })
        });
    });


    require('./suites/screensTests.js');
    require('./suites/salesItemsTests.js');
    require('./suites/checksTests.js');
    require('./suites/checkItemsTests.js');
    require('./suites/ordersTests.js');
解决承诺后,我运行一个函数,使用fs和db.run从csv文件填充表。e、 g

fs.createReadStream('./testdata/globals.csv')
        .pipe(parse({ from: 2 }))
        .on('data', async function (csvrow) {
            db.run('INSERT INTO Globals (Key, ValueInt) VALUES($Key, $ValueInt)', {
                $Key: csvrow[0],
                $ValueInt: csvrow[1]
            }, err => {
                if (err) {
                    console.log('Error seeding Globals table');
                    console.log(err);
                    return;
                }
            });
        });
出于某种原因,当这两个函数运行时,我会得到一个错误“error:SQLITE_error:no-this-table:Globals”,即使(据我所知)已经创建了表

我的测试套件如下所示:-

const createDatabase = () => {
    return new Promise(async function (resolve, reject) {
        await db.serialize(async () => {
            db.run('DROP TABLE IF EXISTS Globals');
            db.run('DROP TABLE IF EXISTS checks');
            db.run('DROP TABLE IF EXISTS SalesItems');
            ...
            ...
            ...
            db.run('CREATE TABLE Globals (Id INTEGER NOT NULL PRIMARY KEY, Key TEXT NOT NULL, ValueInt INTEGER)');  
            ...
            ...
            ...
        })
        resolve();
    });
}
describe('test', function () {
    beforeEach(async function () {
        return new Promise(async function (resolve, reject) {
            createDatabase().then(() => {
                seedTestDatabase();
                resolve();
            })
        });
    });


    require('./suites/screensTests.js');
    require('./suites/salesItemsTests.js');
    require('./suites/checksTests.js');
    require('./suites/checkItemsTests.js');
    require('./suites/ordersTests.js');
}))


因此,在createDatabase()完成之前,seedTestDatabase()不应运行,在seedTestDatabase()完成之前,测试不应运行,但这不会发生。它们似乎都在并行运行,导致了问题。

看看线程上的威胁

看起来使用count方法并检查值是否为0表示否,1表示是是检查表是否存在的一种好方法

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

看看线程上的威胁

看起来使用count方法并检查值是否为0表示否,1表示是是检查表是否存在的一种好方法

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';