Node.js 为什么';jasmine节点mongoose测试是否按预期等待?

Node.js 为什么';jasmine节点mongoose测试是否按预期等待?,node.js,mongoose,jasmine-node,Node.js,Mongoose,Jasmine Node,我正在编写一个简单的应用程序来保存和查找位置。我用的是猫鼬和茉莉节点 用户CRUD测试工作符合预期。但是,我单独创建了用户来测试不同的自定义验证。我还通过清除集合并重新加载所有用户来启动测试,以确保在启动save/update/etc测试之前所有测试数据都是良好的 对于位置,我也在做同样的事情,但是我有几十个位置,我想用一个数组加载它们……并在加载过程中测试负载,以确保它工作正常 如果我只做一个位置,它工作得很好。不止一个,他们失败了 我知道我在这里遗漏了一些与异步相关的步骤,但我不是在寻找错误

我正在编写一个简单的应用程序来保存和查找位置。我用的是猫鼬和茉莉节点

用户CRUD测试工作符合预期。但是,我单独创建了用户来测试不同的自定义验证。我还通过清除集合并重新加载所有用户来启动测试,以确保在启动save/update/etc测试之前所有测试数据都是良好的

对于位置,我也在做同样的事情,但是我有几十个位置,我想用一个数组加载它们……并在加载过程中测试负载,以确保它工作正常

如果我只做一个位置,它工作得很好。不止一个,他们失败了

我知道我在这里遗漏了一些与异步相关的步骤,但我不是在寻找错误的术语,就是现在离它太近了,看不到我在这里犯的根本性的简单错误

版本:

  • 猫鼬:3.6.16
  • 茉莉花节点:1.11.0
  • mongodb:2.4.5
详细信息 测试

it("creating location succeeds", function(done){

    for(var locIndex in testLocations) {
        locations.create(testLocations[locIndex], function(err, location){

            // console.log says location is undefined
            // unless there is only one location, then it works.

            expect(err ).toBeNull();
            expect(location.name ).toBe(testLocations[locIndex].name);
            done();
        });
    }
});
…以及从单独的文件创建函数,该文件包含与位置相关的函数

exports.create = function(location, cb){
    var newLocation = new Location(location);
    // console.log says we make it into here...

    newLocation.save(function(err, newLocation){
        // ...but we never make it in here, except when there's only one location
        if (err) {
            cb(err, null);
        } else {
            cb(null, newLocation);
        }
    });
};
…和一些测试地点

var testLocations = [
    {
        "name" : "A Great Noodle Place",
        "street" : "1234 Elm Street",
        "city" : "Springfield",
        "phone" : "(123) 456-7890",
        "website" : "n00dlesrus.com",
        "district" : "Downtown"
    },
    {
        "name" : "Perfect Pizza Palace",
        "street" : "1234 Professor Ave",
        "city" : "Springfield"
        "phone" : "(321) 654-0987",
        "website" : "cheesegalore.com",
        "district" : "Uptown"
    }
]
谢谢

您正在循环中调用
done()
。所以它在第一次迭代中被调用。这就是为什么当只有1个时它会起作用。您可以尝试使用async,它将迭代列表并在完成时调用最终回调:

it("creating location succeeds", function(done){

    async.each(Object.keys(testLocation), function(key, callback){
        locations.create(testLocations[key], function(err, location){
            expect(err).toBeNull();
            expect(location.name).toBe(testLocations[key].name);
            callback();
        });
    }, function(err) {
        done();
    });
});
您正在循环中调用
done()
。所以它在第一次迭代中被调用。这就是为什么当只有1个时它会起作用。您可以尝试使用async,它将迭代列表并在完成时调用最终回调:

it("creating location succeeds", function(done){

    async.each(Object.keys(testLocation), function(key, callback){
        locations.create(testLocations[key], function(err, location){
            expect(err).toBeNull();
            expect(location.name).toBe(testLocations[key].name);
            callback();
        });
    }, function(err) {
        done();
    });
});