如何更新用户.用于在Meteor中进行Jasmine测试的服务

How to update user.services for Jasmine testing in Meteor

本文关键字:Jasmine 测试 服务 Meteor 何更新 更新 用于 用户      更新时间:2023-09-26

我试图模拟出一个用户来测试我的应用程序,我已经到了可以创建一个测试用户并将其登录到我的应用程序的镜像实例的地步。

我需要比较人们帐户的gmail地址,为了测试这个功能,我想在Meteor用户帐户数据库(这是accounts-google包存储它的地方,我还不需要模拟出整个用户帐户)的user.services.google.email下添加一个测试电子邮件地址。

我不能弄清楚的是如何附加这些信息,而不是只是覆盖已经存在的内容,这是我的代码看起来像:

if (Meteor.users.find().count() === 0) {
    var testUserDetails = {
        email: 'testEmail@gmail.com',
        password: 'testPassword'
    };
    console.log("Creating the Test User");
    var newUserId = Accounts.createUser(testUserDetails);
    Meteor.users.update({
        _id: newUserId
    }, {
        $set: {
            services: {
                google: {
                    email: "testEmail@gmail.com"
                }
            }
        }
    });
} else {
    console.log("There are already users in the Test database");
}
console.log('***** Finished loading default fixtures *****');
},

用户是这样的:

{
    "_id" : "Dw2xQPDwKp58RozC4",
    "createdAt" : ISODate("2015-07-30T04:02:03.261Z"),
    "services" : {
        "password" : {
            "bcrypt" : "asdfasdfasdfdsafsadfasdsdsawf"
        },
        "resume" : {
            "loginTokens" : [ ]
        }
    },
    "emails" : [
        {
            "address" : "testEmail@gmail.com",
            "verified" : false
        }
    ]
}

现在$set只是重写了服务中的所有内容,并且没有用于mongo或js的$push操作,那么我应该如何去做呢?我应该使用对象并手动解析它吗?

*注意我也尝试过使用流星的Accounts.onCreateUser(function(options, user),但面临同样的问题。

[…[…]

当然,有一个$push操作符,它将指定的值附加到数组中。

然而,我认为你要做的是更新一个文档,并保留所有已经设置的值。

你可以这样做:

  1. 首先查询文档以获取要设置的对象。
  2. 更新相应的对象。
  3. 执行MongoDB update操作,设置新对象。
例如:

var user = Meteor.users.findOne({
    _id: newUserId
});
var servicesUserData = user.services;
servicesUserData.google.email = "your_new_email@gmail.com";
Meteor.users.update({
    _id: newUserId
}, {
    $set: {
        "services": {
            servicesUserData
        }
    }
});