Javascript 尝试使用Mocha测试时未正确加载模型
我正在尝试使用摩卡来测试我的express应用程序。我的文件夹结构是: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(__
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我会将模式的初始化移动到一个单独的文件中,该文件在需要时需要。我会为整个项目这样做。