Javascript 尝试使用Mocha测试时未正确加载模型

Javascript 尝试使用Mocha测试时未正确加载模型,javascript,node.js,express,gruntjs,mocha.js,Javascript,Node.js,Express,Gruntjs,Mocha.js,我正在尝试使用摩卡来测试我的express应用程序。我的文件夹结构是: myapp |-app |--models |-test |--mocha-blanket.js |--mocha |--karma |-server.js server.js是我的express服务器。我以前在options.require中有过这样的功能,但据说它使用了blanket.js。我的摩卡毯子.js是: var path = require('path'); var srcDir = path.join(__

我正在尝试使用摩卡来测试我的express应用程序。我的文件夹结构是:

myapp
|-app
|--models
|-test
|--mocha-blanket.js
|--mocha
|--karma
|-server.js
server.js
是我的express服务器。我以前在
options.require
中有过这样的功能,但据说它使用了
blanket.js
。我的
摩卡毯子.js
是:

var path = require('path');
var srcDir = path.join(__dirname, '..', 'app');

require('blanket')({
  // Only files that match the pattern will be instrumented
  pattern: srcDir
});
我的Grunfile有:

mochaTest:
  options:
    reporter: "spec"
    require: 'test/mocha-blanket.js'
    # require: "server.js"
  coverage:
    options:
      reporter: 'html-cov',
      captureFile: 'mocha-coverage.html'
    src: ["test/mocha/**/*.js"]
我得到的错误是:

>> Mocha exploded!
>> MissingSchemaError: Schema hasn't been registered for model "Company".
>> Use mongoose.model(name, schema)
>>     at Mongoose.model (/myapp/node_modules/mongoose/lib/index.js:315:13)
>>     at Object.<anonymous> (/myapp/test/mocha/controllers/company.js:4:22)
>>     at Module._compile (module.js:456:26)
>>     at Module._extensions..js (module.js:474:10)
摩卡咖啡爆炸了! >>MissingSchemaError:尚未为模型“Company”注册架构。 >>使用mongoose.model(名称、模式) >>在Mongoose.model(/myapp/node_modules/Mongoose/lib/index.js:315:13) >>反对。(/myapp/test/mocha/controllers/company.js:4:22) >>在模块处编译(Module.js:456:26) >>at Module._extensions..js(Module.js:474:10)
我肯定我做了一些(或很多)不正确的事情。但我不确定是什么。有什么想法吗?

我认为您的测试代码没有正确初始化您的应用程序,特别是初始化Mongoose模式和模型

mocha/controllers/company.js
中,您可能正在使用类似以下代码:

var Company = mongoose.model('Company');
但是,如果跳过了
公司
模型(将模型与模式连接在一起)的初始化,则会出现错误

给出一个非常简短的独立示例,此代码将失败并出现相同的错误:

var mongoose = require('mongoose');
var Company  = mongoose.model('Company');
添加了初始化后,此代码运行良好:

var mongoose = require('mongoose');

mongoose.model('Company', new mongoose.Schema());

var Company = mongoose.model('Company');

出现此错误是因为您没有将模型显式地“加载”到mongoose。我已通过以下方式解决了此问题: 1模型初始化脚本:

module.exports = {
  storage:{
    sample: require('models/storage/sample'),
    other models scoped to "storage" connection...
  },
  accounts: {
    company: require('models/accounts/company'),
    etc...
  }
};
这在每个mongoose.createConnection回调中启动一次:

var accounts = mongoose.createConnection(config.get('mongoose:accounts:uri'), config.get('mongoose:accounts:options'), function(err){
  if (err) throw err;
  console.log('connection to accounts database open');
  require('models/init').accounts;
});
它运行所有模型声明代码,稍后在测试中注册所有模型

确保数据库连接中间件。这家伙确保连接打开,初始化脚本成功运行

var storage = require('models').storage;
var accounts = require('models').accounts;

module.exports = function ensureDbConnectionMiddleware(req, res, next){
  var count = 0;
  var interval = setInterval(function(){
    if (storage._readyState === 1 && accounts._readyState === 1){
      clearInterval(interval);
      return process.nextTick(function(){
        next();
      });
    }else{
      if (count++ > 50){
        res.json({status: 0, message: 'Database offline'});
        throw new Error('Database is offline');
      }
    }
  }, 100);
};
稍后的测试

var should = require('should');
var express = require('express');
var app = express();
app.use(express.bodyParser());
app.use(require('middleware/ensureDbConnection'));
require('routes')(app);
//etc...
我不确定这是否是最好的解决方案,但效果相当不错。
它当然有一个主要的警告:你必须保持所有这些东西同步。但是,您可以尝试将其委托给grunt。

对于Mocha,您需要等待MongoDB连接打开,然后再尝试使用模型

  var mongoose = require('mongoose');

  var Company;

  describe('Unit Test', function () {
    before(function(done) {
      mongoose.connection.once('open', function() {
        Company = mongoose.model('Company');
        done();
      });
    });

    ... tests here ...

  });

这个错误似乎与摩卡咖啡或毯子无关。这是一个非常天真的问题,但它是否只在摩卡咖啡中失败?当你启动你的服务器时,它真的有效吗?如果没有,添加一些关于您的模型的详细信息将有助于诊断。当我启动服务器时,它可以正常工作——但只有当使用mochaMy服务器代码进行的grunt测试正确加载时,它才能正常工作。你是对的,我有:
var Company=mongoose.model('Company')
@Shamoon在初始化
公司
模型的代码处添加一个
控制台。记录
,查看它是否被触发。如果没有,则无法正确调用它:)
mongoose.model('Company',new mongoose.Schema())
,这不会使用我在模型文件中定义的模式吗?@Shamoon我会将模式的初始化移动到一个单独的文件中,该文件在需要时
需要
。我会为整个项目这样做。