如何为依赖特定Sails应用的Sails可安装钩子编写Mocha测试?
解决Sails钩子测试中lift/lower方法失效的问题
这个问题我之前也碰到过!核心问题在于你直接require('myapp')拿到的并不是能调用lift()/lower()的Sails应用实例——因为默认情况下,npm包的main入口不会暴露这些启动方法。给你两个靠谱的解决方案:
方案一:使用Sails核心API启动指定路径的应用
这是最稳妥的方式,不需要修改依赖项目的配置:
调整你的bootstrap.test.js代码,直接用Sails核心模块来启动myapp,并指定应用路径和自定义钩子:
const sails = require('sails'); const path = require('path'); // 提前加载myapp的基础配置(可选,用于合并自定义配置) const myAppBaseConfig = require('../node_modules/myapp/config'); before(function(done) { this.timeout(15000); // 适当延长超时时间,避免启动慢导致测试失败 console.log("Bootstrap lifting sails app..."); sails.lift({ // 关键:指定myapp的实际路径 appPath: path.resolve(__dirname, '../node_modules/myapp'), hooks: { // 加载本地开发的myhook,覆盖myapp默认的同名钩子(如果有的话) "myhook": require('../api/hooks/myhook'), "grunt": false // 禁用grunt加快启动速度 }, log: { level: "error" }, // 合并myapp的基础配置,保证应用行为和正常启动一致 ...myAppBaseConfig }, function(err, sailsInstance) { if (err) return done(err); // 将启动好的sails实例挂载到全局,方便测试用例中访问 global.sails = sailsInstance; done(); }); }); after(function(done) { // 确保只有当sails实例存在时才执行lower if (global.sails) { global.sails.lower(function(err) { if (err) console.error('Failed to lower sails:', err); done(err); }); } else { done(); } });
为什么这样有效?
Sails的lift()方法需要知道应用的根路径才能加载配置、模型、控制器等资源。直接指定appPath指向node_modules里的myapp,相当于告诉Sails:“我要启动这个目录下的Sails应用”,同时我们手动注入自己开发的myhook,就能模拟钩子在真实应用中的运行环境。
方案二:修改myapp的package.json(仅适用于你能修改myapp的情况)
如果你是myapp的维护者,可以修改它的package.json,让main字段指向应用的启动入口app.js:
{ "main": "./app.js" }
这样你原来的require('myapp')就能拿到app.js导出的Sails实例,不过这种方式的灵活性不如方案一,因为它依赖于myapp的配置修改。
额外注意事项
- 确保myapp的所有依赖都已安装:因为myapp是devDependency,执行
npm install时要确保加上--include=dev(npm v7+默认会装dev依赖) - 钩子路径要准确:
require('../api/hooks/myhook')要指向你的钩子入口文件(通常是index.js) - 超时时间要足够:如果你的应用启动较慢,可以把
this.timeout()的值再调大一些
内容的提问来源于stack exchange,提问作者eyn
相关产品推荐
相关产品推荐

