1

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

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

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

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

我知道我在这里遗漏了一些与异步相关的步骤,但是我要么在搜索错误的术语,要么现在离它太近了,无法看到我在这里犯的根本简单的错误。

版本:

  • 猫鼬: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"
    }
]

谢谢!

4

1 回答 1

1

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

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();
    });
});
于 2013-08-29T02:56:25.237 回答