Node.js 猫鼬模型测试需要模型

Node.js 猫鼬模型测试需要模型,node.js,mongoose,mocha.js,Node.js,Mongoose,Mocha.js,我在测试猫鼬模型时遇到问题 我有一个这样的结构 应用程序 模型 地址 使用者 组织机构 试验 模型用户和组织都需要知道模型地址。我的模型结构如下: module.exports = function (mongoose, config) { var organizationSchema = new mongoose.Schema({ name : { type : String }, addresse

我在测试猫鼬模型时遇到问题

我有一个这样的结构

  • 应用程序
    • 模型
      • 地址
      • 使用者
      • 组织机构
    • 试验
模型用户和组织都需要知道模型地址。我的模型结构如下:

module.exports = function (mongoose, config) {

    var organizationSchema = new mongoose.Schema({

        name : {
            type : String
        },
        addresses : {
            type : [mongoose.model('Address')]
        }

    });

    var Organization = mongoose.model('Organization', organizationSchema);

    return Organization;
};
在我的普通应用程序中,在要求用户和组织之前,我需要地址,一切都很好。我现在为用户和组织编写了测试。为了注册地址模型,我调用
require('../models/Address.js')
如果我运行一个测试,这就可以了。但若我在一个批中运行所有测试,我会得到一个错误,因为我尝试了两次注册地址

OverwriteModeError:一旦编译,就无法覆盖地址模型。


如何解决此问题?

问题是不能设置mongoose模型两次。解决问题的最简单方法是利用node.js
require
函数

Node.js缓存对
require
的所有调用,以防止模型初始化两次。但是你需要用函数包装你的模型。展开它们将解决您的问题:

var mongoose = require('mongoose');
var config = require('./config');

var organizationSchema = new mongoose.Schema({
    name : {
        type : String
    },
    addresses : {
        type : [mongoose.model('Address')]
    }
});

module.exports = mongoose.model('Organization', organizationSchema);
另一种解决方案是确保每个模型只初始化一次。例如,您可以在运行测试之前初始化所有模块:

Address = require('../models/Address.js');
User = require('../models/User.js');
Organization = require('../models/Organization.js');

// run your tests using Address, User and Organization
或者,您可以向模型中添加
try-catch
语句来处理这种特殊情况:

module.exports = function (mongoose, config) {

    var organizationSchema = new mongoose.Schema({

        name : {
            type : String
        },
        addresses : {
            type : [mongoose.model('Address')]
        }

    });

    try {
        mongoose.model('Organization', organizationSchema);
    } catch (error) {}

    return mongoose.model('Organization');
};


更新:在我们的项目中,我们有
/models/index.js
文件来处理一切。首先,它调用
mongoose.connect
来建立连接。然后它需要
models
目录中的每个模型,并创建一个字典。因此,当我们需要某个模型(例如,
user
)时,我们通过调用
require('/models')来请求它。user

我通过修补r.js并确保所有模块都使用localRequire调用来修复这个问题

在这里签出线程


这个问题已经有了答案,但要想用一种独特的方式来完成这个检查。此示例项目使用一个register_models.js,其中包含一个文件名数组中的所有模型。它工作得非常好,你可以在任何你需要的地方找到你所有的模型。请记住,node.js的缓存将在项目运行时缓存项目中的对象。

我使用try/catch来解决这个问题,它工作正常。但我认为这不是最好的方法

try{
    var blog = mongoose.model('blog', Article);
} catch (error) {}
最佳解决方案(海事组织):


我想采用第一种解决方案,但我担心会出现对mongoose的引用,我希望这不会阻止对mongoose的引用,因为我在app.js文件中使用了mongoose.connect,但正如您所说,node将收集requires,并在已经需要的情况下提供副本?重构我的代码,删除了函数包装器,工作正常,谢谢!是的,但是在这种情况下,您应该在初始化任何模型之前调用
mongoose.connect
。我认为mongoose会缓冲这些操作,直到建立连接为止?我需要我的模型,然后才能连接到数据库,就我所见,我在这里回答了一个类似的问题。
try {
  mongoose.model('config')
} catch (_) {
  mongoose.model('config', schema)
}