当前位置: 首页 > 知识库问答 >
问题:

使用Jasmine节点测试时Mongoose模型自定义函数中的值消失

蒋英博
2023-03-14

我试图在我的Mongoose模型上测试我的自定义方法,但是我在测试模型中设置的值消失并使测试失败。测试看起来像这样:

it('should get the friend id', function(){
    var conversation = new Conversation({
        'users': [new ObjectId('0'), new ObjectId('1')]
    });

    expect(conversation.getFriendId('0')).toEqual(new ObjectId('1'));
});

我的模型声明包含以下内容:

var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;

var ConversationSchema = new mongoose.Schema({
    'users': [{'type': ObjectId, 'ref': 'User'}]
});

ConversationSchema.methods.getFriendId = function(userId) {
    return this.users;
    //return this.users[0] === new ObjectId(userId)
    //    ? this.users[1] : this.users[0];
};

module.exports = mongoose.model('Conversation', ConversationSchema);

当我运行测试时,我得到:

Expected [  ] to equal { path : '1', instance : 'ObjectID', validators : [  ], setters : [  ], getters : [  ], options : undefined, _index : null }.

我在测试中设置了用户,所以返回值应该是用户数组。(它在当前状态下仍然无法通过测试,但理论上应该在取消注释第二个返回语句时通过。)相反,用户数组显示为空。

如何让测试模型中的值出现在我的自定义函数中?

共有1个答案

王炜
2023-03-14

我改变了一些事情,让它最终发挥作用。

我将users数组更改为类似集合的对象,因为它更准确地表示了数据。集合的键是ObjectId的字符串。

要创建新的ObjectId,必须具有12字节字符串或24个字符的十六进制字符串。最初,我试着用一个一位数的字符串。我添加了一个spec帮助程序,它用24个字符的十六进制字符串存储虚拟ID。

猫鼬。模式。类型。ObjectId和猫鼬。类型。ObjectId是两个不同的东西。我尝试了每一个,然后才意识到我需要同时使用这两个。创建模式时,我需要mongoose。模式。类型。ObjectId。其他任何时候我引用ObjectId类型时,我都需要mongoose。类型。ObjectId

我试图从我定义它们以访问它们的文件中返回模型。相反,我需要调用mongoose.model()来获取我的模型。

有了这些变化,我的模型定义现在看起来像这样:

var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;

var ConversationSchema = new mongoose.Schema({
    'users': Object,
    'messages': [
        {
            'text': String,
            'sender': {'type': ObjectId, 'ref': 'User'}
        }
    ]
});

ConversationSchema.methods.getFriendId = function(userId) {
    for (var u in this.users) {
        if (u !== userId) return new mongoose.Types.ObjectId(u);
    }

    return null;
};

// other custom methods...

mongoose.model('Conversation', ConversationSchema);

我的测试如下所示:

describe('getFriendId()', function(){
    var mongoose = require('mongoose');
    var ObjectId = mongoose.Types.ObjectId;

    require('../../../models/Conversation');
    var Conversation = mongoose.model('Conversation');

    var helper = require('../spec-helper');

    it('should get the friend id', function(){
        users = {};
        users[helper.ids.user0] = true;
        users[helper.ids.user1] = true;

        var conversation = new Conversation({ 'users': users });

        expect(conversation.getFriendId(helper.ids.user0)).toEqual(new ObjectId(helper.ids.user1));
    });
});

 类似资料:
  • 问题内容: 有谁知道这是否可能?大部分用于节点检查器的示例似乎都旨在调试调用的网页。我希望能够调试茉莉花节点测试。 问题答案: 我最终写了一个名为toggle的工具: 您可以将其放入单元测试中,例如: 然后运行测试,例如:node –debug myfile.js debug。如果运行调试切换,则将一直等到ctrl-c以外的任何内容。Ctrl- c退出。您也可以重新运行,这很好。 w0000t。

  • 我正在编写一个简单的应用程序来保存和查找位置。我用的是猫鼬和茉莉节点。 用户CRUD测试工作符合预期。但是,我单独创建了用户来测试不同的自定义验证。我还通过清除集合并重新加载所有用户来启动测试,以确保在启动save/update/etc测试之前所有测试数据都是良好的。 对于位置,我也在做同样的事情,但我有几十个位置,我想使用数组加载它们。。。并在整个过程中测试负载,确保其正常工作。 如果我只做一个

  • 问题 假如你正在使用 CoffeeScript 写一个简单地计算器,并且想要验证其功能是否与预期一致。可以使用 Jasmine 测试框架。 讨论 在使用 Jasmine 测试框架时,你要在一个参数(spec)文档中写测试,文档描述的是代码需要测试的预期功能。 例如,我们希望计算器可以实现加法和减法的功能,并且可以正确进行正数和负数的运算。我们的 spec 文档如下列所示。 # calculator

  • 问题内容: 我有以下控制器: 然后在茉莉花中进行以下测试: “应创建未分配用户的列表”测试失败,并显示以下错误: TypeError:’undefined’不是一个函数(评估$ browser。$$ checkUrlChange()) 我真的不知道为什么。任何帮助表示赞赏。 问题答案: 当您在angular.js和angular-mocks.js之间不匹配时,似乎会出现此问题。请确保两个文件的版本

  • 问题内容: 我想将Mongoose模型分离到一个单独的文件中。我试图这样做: 然后,我尝试使用如下模型: 在单独的模块中引用模型是否合理? 问题答案: 基本方法看起来很合理。 作为一种选择,您可以考虑集成模型和控制器功能的“提供商”模块。这样,您可以让app.js实例化提供程序,然后可以执行所有控制器功能。app.js只需指定要实现的具有相应控制器功能的路由即可。 为了进一步整理,您还可以考虑使用

  • 我无法在任何地方找到如何在ES自定义评分函数中测试空值的示例。根据文档,脚本是时髦的,根据日志,脚本是无痛的评估,但即使这样,我仍然对一些错误感到困惑 这似乎表明我正在尝试将双精度值cas到布尔值并提出,但我需要测试非空值。 我的评分脚本应该怎么写? 编辑:我知道在无痛中我不能使用三进制的<代码>?:运算符,所以我必须显式地编写< code>doc['xx']。值!= null。然而,对于用空值索