【问题标题】:Models not loading properly when trying to use Mocha testing尝试使用 Mocha 测试时模型无法正确加载
【发布时间】:2014-02-14 20:49:28
【问题描述】:

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

myapp
|-app
|--models
|-test
|--mocha-blanket.js
|--mocha
|--karma
|-server.js

server.js 是我的快递服务器。我之前在options.require 有过,但documentation 说要使用blanket.js。我的mocha-blanket.js 是:

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

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

我的 Gruntfile 有:

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)

我确定我做错了某事(或很多事)。但我不确定是什么。有什么想法吗?

【问题讨论】:

  • 该错误似乎与 Mocha 或 Blanket 无关。这是一个非常幼稚的问题,但它是否仅在 Mocha 中失败?当您启动服务器时,它是否真的有效?如果没有,添加一些有关模型的详细信息将有助于诊断。
  • 当我启动我的服务器时它工作正常 - 只有在使用 mocha 进行 grunt 测试时才能正常工作

标签: javascript node.js express gruntjs mocha.js


【解决方案1】:

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

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

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

但是,如果 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');

【讨论】:

  • 我的服务器代码可以正常加载。你是对的,我有:var Company = mongoose.model('Company');
  • @Shamoon 在初始化Company 模型的代码处添加console.log 并查看它是否被触发。如果没有,它没有被正确调用:)
  • mongoose.model('Company', new mongoose.Schema());,那不会使用我在模型文件中定义的架构吗?
  • @Shamoon 我只会将您的架构的初始化移动到一个单独的文件中,该文件在需要时require'ed。
  • 我会为你的整个项目这样做。
【解决方案2】:

您收到此错误是因为您没有明确地将模型“加载”到 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。

【讨论】:

    【解决方案3】:

    对于 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 ...
    
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多