在单独的文件中testingMongoose模型会导致问题(使用Mockgoose&Lab)

每当一个Mongoose模型在加载之后试图加载,就会抛出一个错误,例如:

错误:uncaughtException:编译后无法覆盖Account模型。 date = Fri Feb 26 2016 10:13:40 GMT-0700(MST),pid = 19231,uid = 502,gid = 20,cwd = / Users / me / PhpstormProjects / project,execPath = / usr / local / Cellar / node / 0.12.4 / bin / node,version = 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],运行时间= 648559 OverwriteModelError:编译后无法覆盖Account模型。

我很好,但现在我正在为我的模型写unit testing,我遇到了一个问题。

只是一些关于文件结构的基本信息…

我将所有的Mongoose模型放在src/models/文件夹中的单独文件中,并且加载这些模型,只需要文件夹,传递一个Mongoose对象和src/models/index.js文件将加载所有模型,并返回模型的一个对象。 index.js文件可以在这里看到(而不是相关的,但模型名称基本上是文件名,没有.js

现在unit testing的模型也被分割成单独的文件。 Theres每个模型的一个testing文件。 即使每个unit testing文件都集中在一个特定的模型上,其中一些也使用其他模型(用于之前/之后的任务)。

初始问题

我刚刚创build了第二个unit testing文件,当我独立执行每个单元时,它们工作得很好。 但是,当我执行所有这些,我收到上述错误,指出我试图加载模型不止一次。 因为我需要每个unit testing用例中的./models ,所以不止一次加载它们。

第一次决议尝试

我想也许我可以在每个单独的unit testing文件中通过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 ) } 

我现在在我的模型中尝试了这一点,似乎工作正常,(好吧,我没有得到上面列出的错误,说我多次加载模型)

新问题

现在,无论何时unit testing执行,我收到一个错误,错误显示一次模型,但其相同的错误:

 $ 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 

堆栈跟踪中没有太多细节

我不确定它是否由我添加到每个模型中的代码引起,检查它是否已经加载,如果是,它会显示,当我执行单个unit testing,或者它只会显示不能设置属性' 0'未定义两次(一次为一个成功的初始模型负载,然后两次为接下来的两个…我会认为)

如果有人有任何意见,我将非常感激! 谢谢

更新

我试着运行lab --debug获取更多的信息,虽然它没有显示任何堆栈跟踪显示的错误,它使双打…这是奇怪的。 所以如果在执行lab时候有2个, lab --debug显示4个

另外,我使用温斯顿做我的日志logging。 如果我将日志级别更改为debugging(在控制台中显示大量debugging条目),则不会显示有关这些错误的任何条目…因此,这使我认为这可能不是由我的脚本引起的,而是某种在unit testing依赖?

错误说他们来自error.js文件,但不要说别的。 我试图通过find . -name 'events.js'find一个error.js find . -name 'events.js' find . -name 'events.js' ,没有结果..奇怪

我认为你放入每个模型的代码是一个黑客。 在正常的执行过程中, require有“全局”的效果 – 一旦你导入了模块,它将不会被第二次导入。

在testing过程中,这种正常stream量可能会改变,但这意味着最好find一个可以在testing中本地实施的解决scheme。

它也看起来像你有这个问题相似的问题 – 与摩卡'看'OverwriteModelError 。

有一些解决scheme可以尝试:

1)每次创build新的mongoose连接:

 var db = mongoose.createConnection() 

2)通过nodemon运行摩卡。 这一个看起来令我费解,但仍然值得尝试,也许它使每个testing完全独立运行。 我也假设你使用摩卡进行testing:

 nodemon --exec "mocha -R min" test 

3)每次testing后清除mongoose模型和scheme:

 after(function(done){ mongoose.models = {}; mongoose.modelSchemas = {}; mongoose.connection.close(); done(); });