每当蒙鹅模型在加载后尝试加载时,就会引发错误,如:
错误: uncaughtException:编译后不能覆盖
Account模型。2016年2月26日10:13:40格林尼治时间-0700 (MST),pid=19231,uid=502,gid=20,cwd=/ date=Fri /me/PhpstormProjects/project,pid=19231 version=v5.2.0,argv=/usr/local/c业力/node/0.12.4/bin/node,/usr/local/c业力/node/0.12.4/bin/lab,rss=73306112,heapTotal=62168096,heapUsed=29534752,loadavg=1.6005859375,1.84716796875,1.8701171875,uptime=648559 OverwriteModelError:无法覆盖Account模型。
我很好,但现在我正在为我的模型编写单元测试,我遇到了一个问题。
只是一些关于文件结构的基本信息。
我将所有的Mongoose模型放在单独的文件中,位于src/models/文件夹中,要加载这些模型,只需要求文件夹,将一个Mongoose对象传递给它,src/models/index.js文件将加载所有模型,并返回模型的一个对象。index.js文件可以看到这里 (与其无关,但模型名称基本上是文件名,没有.js)
现在,对模型的单元测试也被分成不同的文件。每个模型都有一个测试文件。尽管每个单元测试文件都集中在一个特定的模型上,但它们中的一些也使用其他模型(用于任务之前/之后)。
初始问题
我刚刚创建了第二个单元测试文件,当我独立执行每个单元测试文件时,它们都工作得很好。但是,当我执行所有这些错误时,我会收到上面的错误,说明我尝试加载模型不止一次。因为我在每个单元测试用例中都需要./models,所以我am加载了它们不止一次。
第一次解决尝试
我想也许我可以通过after()在每个独立的单元测试文件中清除所有加载的模型,如下所示:
after(function(done) {
mongoose.connection.close(function() {
mongoose.connection.models = {}
done()
})
})它根本不起作用(没有新的错误,但一旦编译错误持久化,也不能覆盖Account模型)
第二次尝试(半成功)
当模型试图返回Mongoose.model()时,不要在最后一行中抛出错误,而是在模型的顶部插入一些逻辑,以检查模型是否已加载,如果是,则返回,即模型对象:
const thisFile = path.basename( __filename ).match( /(.*)\.js$/ )[ 1 ]
const modelName = _.chain( thisFile ).toLower().upperFirst().value()
module.exports = Mongoose => {
// Return this model, if it already exists
if( ! _.isUndefined( Mongoose.models[ modelName ] ) )
return Mongoose.models[ modelName ]
const Schema = Mongoose.Schema
const appSchema = new Schema( /* ..schema.. */)
return Mongoose.model( modelName, appSchema )
}我现在正在我的模型中尝试这个方法,它看起来还不错,(好的意思是我没有看到上面列出的错误,说我要多次加载模型)。
新问题
现在,每当单元测试执行时,我都会收到一个错误,该错误在每个模型中显示一次,但它是相同的错误:
$ lab
..................................................
...
Test script errors:
Cannot set property '0' of undefined
at emitOne (events.js:83:20)
at EventEmitter.emit (events.js:170:7)
at EventEmitter.g (events.js:261:16)
at emitNone (events.js:68:13)
at EventEmitter.emit (events.js:167:7)
Cannot set property '0' of undefined
at emitOne (events.js:83:20)
at EventEmitter.emit (events.js:170:7)
at EventEmitter.g (events.js:261:16)
at emitNone (events.js:68:13)
at EventEmitter.emit (events.js:167:7)
Cannot set property '0' of undefined
at emitOne (events.js:83:20)
at EventEmitter.emit (events.js:170:7)
at EventEmitter.g (events.js:261:16)
at emitNone (events.js:68:13)
at EventEmitter.emit (events.js:167:7)
There were 3 test script error(s).
53 tests complete
Test duration: 1028 ms
No global variable leaks detected在堆栈跟踪中没有太多的细节可以删除。
我不确定这是由我添加到每个模型中的代码引起的,检查它是否已经加载,如果是的话,它要么会在执行单个单元测试时显示出来,要么只会显示不能两次设置未定义的的属性'0‘(一次是成功的初始模型加载,然后两次是接下来的两次.我想)
如果有人有任何意见,我会非常感激的!谢谢
更新
我试着运行lab --debug以获取更多信息,虽然它没有显示错误周围的任何堆栈跟踪,但它会使错误加倍。这很奇怪。因此,如果只执行lab时只有2,则lab --debug显示4
此外,我还使用温斯顿进行日志记录。如果我将日志级别更改为debug,它显示控制台中调试条目的,它不会显示围绕这些错误的任何条目.因此,这让我认为它可能不是由我的脚本引起的,而是由单元测试依赖项引起的?
这些错误说它们起源于error.js文件,但别说太多。我试图通过find . -name 'events.js'找到一个find . -name 'events.js',但没有结果。奇怪
发布于 2016-03-04 23:10:43
我认为你在每个模型中放置的代码是一个黑客。在正常执行过程中,require具有“全局”效应--一旦您导入该模块,就不会再次导入它。
这个正常的流可能在测试期间改变了,但这意味着最好找到一个可以在测试中本地实现的解决方案。
看起来,您的问题类似于在这个问题中讨论的问题- OverwriteModelError配摩卡手表。
有一些解决办法可以尝试:
1)每次创建新的猫鼬连接:
var db = mongoose.createConnection()2)通过nodemon运行摩卡。这个看上去令我费解,但还是值得一试,也许它能让每个测试完全独立运行。我还假设您在测试时使用摩卡:
nodemon --exec "mocha -R min" test3)每次测试后明确的猫鼬模型和方案:
after(function(done){
mongoose.models = {};
mongoose.modelSchemas = {};
mongoose.connection.close();
done();
});https://stackoverflow.com/questions/35658834
复制相似问题