Почему тест jasmine-node mongoose не ждет, как ожидалось?

Я пишу простое приложение, которое сохраняет и ищет местоположения. Я использую мангуст и жасмин-узел.

Пользовательский CRUD-тест работает, как и ожидалось. Однако я создал пользователей по отдельности, чтобы протестировать различные пользовательские проверки. Я также начинаю тесты с очистки коллекции и повторной загрузки всех пользователей, чтобы убедиться, что все тестовые данные в порядке, прежде чем запускать тесты сохранения/обновления/и т.д.

Для местоположений я делаю то же самое, но у меня есть несколько десятков местоположений, и я хотел загрузить их с помощью массива... и проверить загрузку по пути, чтобы убедиться, что она работает нормально.

Если я делаю только одну локацию, все работает нормально. Более одного, и они терпят неудачу.

Я знаю, что здесь упущен какой-то шаг, связанный с асинхронностью, но я либо ищу неправильные термины, либо я слишком близок к этому, чтобы увидеть фундаментально простую ошибку, которую я здесь делаю.

Версии:

  • мангуст: 3.6.16
  • жасмин-узел: 1.11.0
  • монгодб: 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"
    }
]

Спасибо!


person Matthew Bakaitis    schedule 29.08.2013    source источник


Ответы (1)


Вы вызываете 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();
    });
});
person tandrewnichols    schedule 29.08.2013