每当 Mongoose 模型在加载后尝试加载时,都会引发错误,例如:
Account
错误:uncaughtException:编译后无法覆盖模型。日期=2016 年 2 月 26 日星期五 10:13:40 GMT-0700 (MST),pid=19231,uid=502,gid=20,cwd=/Users/me/PhpstormProjects/project,execPath=/usr/local/Cellar/节点/0.12.4/bin/node, 版本=v5.2.0, argv=[/usr/local/Cellar/node/0.12.4/bin/node, /usr/local/Cellar/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
在每个单元测试用例中都需要,因此我不止一次加载它们。
第一次解决尝试
我想也许我可以通过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
以获取更多信息,虽然它没有显示出现的错误周围的任何堆栈跟踪,但它使它们加倍......这很奇怪。所以如果执行时有 2 lab
,则lab --debug
显示 4
另外,我使用Winston进行日志记录。如果我将日志级别更改为调试,这在控制台中显示了很多调试条目,它不会显示这些错误周围的任何条目......所以这让我认为这可能不是由我的脚本引起的,而是由某些东西引起的在单元测试依赖项中?
错误说它们来自error.js文件,但不要说太多。我试图通过 找到一个error.js find . -name 'events.js'
,但没有结果.. 奇怪