You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为依赖特定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:31:31