2013-08-29 3 views
1

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

Пользователь 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" 
    } 
] 

Спасибо!

ответ

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(); 
    }); 
});