Node.js 在Mocha中,如何确保在运行每个测试之前完成beforeach?在一个接一个地运行之前,内部的函数是什么?
在我的mocha测试中,我在运行测试之前运行了一些函数来设置db。第一个函数创建所有数据库表,如下所示:-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');
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';