gpt4 book ai didi

node.js - 让 Mocha 等待 index.js 完成加载后再运行测试文件

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:54 24 4
gpt4 key购买 nike

我的文件夹结构为:

- app
- config
- config.js // environment variables
- express.js // creates an express server
- passwords
- passwords.controller.js
- passwords.route.js
- passwords.test.js
- index.js // main app file

我的索引文件异步加载应用程序:

function initMongoose() {

...

return mongoose.connect(config.mongo.host, {useNewUrlParser: true, keepAlive: 1})
.then((connection) => {

// Password is a function which connects the Password schema to the given connection
Password(connection);
})
.catch((e) => {
throw new Error(`Unable to connect to database: ${config.mongo.host}`);
});
}

async init() {

await initMongoose();

const app = require('./config/express');
const routes = require('./index.route');

app.use('/api', routes);

...

app.listen(3000, () => {
console.log('server started');
});
}

module.exports = init();

我的测试文件的构造如下:

// Load the app async first then continue with the tests
require('../index').then((app) => {

after((done) => {
mongoose.models = {};
mongoose.modelSchemas = {};
mongoose.connection.close();
done();
});

describe('## Passwords API', () => {
...
});
});

我开始这样的测试:

"test": "cross-env NODE_ENV=test ./node_modules/.bin/mocha --ui bdd --reporter spec --colors server --recursive --full-trace"

这就是奇怪的事情让我变得更好的地方。基本上它会在任何之前加载passwords.controller.js,这是因为--recursive选项。这种情况不应该发生,因为 index.js 需要首先加载,以便它可以在任何测试运行之前连接到 mongoose 等,如果没有,那么来自 passwords.controller.js 的这段代码 将抛出 MissingSchemaError:尚未为模型“Password”注册架构。 因为此时尚未设置模型Password:

const Password = mongoose.connection.model('Password');

所以我尝试在 --recursive 选项之前添加 --require ./index.js ,这确实在 passwords.controller.js 之前加载其他文件 但后者仍然在 index.js 完成之前运行。

解决方案here不起作用,因为 index.js 没有首先运行。

如何修改我的 test 脚本以允许我的 index.js 在运行任何测试文件之前完成?

最佳答案

describe('## Passwords API', function() {
let appInstance;

before((done) => {
require('index.js').then((app) => {
appInstance = app
done();
});
});
});

引用号:https://mochajs.org/#asynchronous-hooks

另一种可能的模式是有一个特殊的帮助文件。这就像单例或某种缓存。这允许服务器仅引导一次,并为所有测试共享。请注意,这可能会在单元测试中导致不必要的副作用,但可以加快不影响应用程序对象的测试速度。

例如testUtil.js

let app = null;
async function getApp(){
if(app){
return app;
}
app = await require('index.js')
return app
}

module.export = {
getApp,
}

在你的测试文件中

const helper = require('[your path]/testUtil.js')
describe('## Passwords API', function() {
let appInstance;

before((done) => {
helper.getApp().then((app) => {
appInstance = app
done();
});
});
});

我还建议将所有测试放在一个单独的文件夹中(可能称为“测试”)。这将确保 --recursive 仅加载测试。另一个好处是在生产中您可以跳过此文件夹

关于node.js - 让 Mocha 等待 index.js 完成加载后再运行测试文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56687388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com