Intereting Posts
Задержка Socket.io при запуске события «отключить»? Создать панель администратора в expressjs, лучший способ подсчета пользователей без многого? специфическая зависимость ОС npm package.json Mongoose ограничивает запрос до 1000 результатов, когда мне нужно больше / все (переход с 2.6.5 на 3.1.2) AWS CodeDeploy Скрипт AfterInstall запускается из агента развертывания кода Могу ли я использовать Firebase Hosting для написания RESTful API в Node.js npm 5.4.1 установить / удалить все сбои Jenkins build step failed при вызове «npm» на mac-os-x Yosemite Передача жестко заданного значения через схему мангуста как отправить json в качестве ответа после аутентификации паспорта в node.js Метод экземпляра Mongoose `this` не относится к модели Express промежуточное ПО не может ловить ошибки, вызванные async / await, но почему? Как создать папку или ключ на s3 с помощью AWS SDK для Node.js? Добавьте бота в конференцию Twilio и сообщите некоторую информацию, используя конференцию Friendly name Установить LogStreamName для вызова AWS Lambda

Тест Mocha выполняет обратный вызов дважды при сбое

У меня простая схема Mongoose, которую я тестирую с помощью Mocha; когда я запускаю тест с обратным вызовом «success», он выполняется нормально, однако, когда последний тест выполняется, он терпит неудачу и, как представляется, снова запускает тест (я получаю два вывода: один из них заполняет объект ошибки, а второй – возвращает null в объект ошибки.) Выполнение двух тестов ниже приводит к следующему выводу:

Cabinet: â should return all authorized â should return not authorized <-- it succeeds the first time? 1) should return not authorized 2 passing (42ms) 1 failing <--- what? there are only two tests 1) Cabinet: should return not authorized : Uncaught AssertionError: expected null to exist <--- see test 

ЭТОТ ПОВТОРЫ ИСПЫТАНИЙ

 it("should return not authorized error ", function(done){ var newCabinet = { name: "A new cabinet", description: "Some remote cabinet", authorizedBorrowers : ["imatest","imanothertest"], cabinetInventory : [] }; Cabinet.newCabinet(newCabinet, function(err, cabinet){ if (err) { console.log("Unable to create cabinet"); done(err); } Cabinet.isAuthorizedBorrower(cabinet._id, "bob", function(cberr, borrower){ should.exist(cberr); <-- 'expected null to exist' points here done(); }); }); }); 

ЭТОТ ИСПЫТАТЕЛЬНЫЕ РАБОТЫ

 it("should not return unauthorized error ", function(done){ var newCabinet = { name: "A new cabinet", description: "Some remote cabinet", authorizedBorrowers : ["imatest","imanothertest"], cabinetInventory : [] }; Cabinet.newCabinet(newCabinet, function(err, cabinet){ if (err) { console.log("Unable to create cabinet"); done(err); } //console.log("ID " + cabinet._id) Cabinet.isAuthorizedBorrower(cabinet._id, "imatest", function(cberr, borrower){ should.not.exist(cberr); done(); }); }); }); 

Схема

 var cabinetSchema = new Schema({ name: String, description: String, thumbnail : Buffer, authorizedBorrowers : [], defaultCheckout : {type : Number, default: 0} // default checkout mins = no time }); var hasBorrower = function(cabinet, borrower){ if (cabinet===null) return false; if (cabinet.authorizedBorrowers.length === 0) return false; return (cabinet.authorizedBorrowers.indexOf(borrower) >= 0) } cabinetSchema.statics.isAuthorizedBorrower = function(cabinet_id, borrowername, cb ){ this.findOne({_id: cabinet_id}, function(err, cabinet){ if (err) cb(err,null); if (!hasBorrower(cabinet, borrowername)) cb(new Error(errorMsgs.borrowerNotAuthorized),null); cb(null,borrowername); }); }; 

Когда вы это сделаете, добавьте return; чтобы избежать вызова done обратного вызова дважды. Это для мокко, но также для обработки обратного вызова common.js.

  if (err) { console.log("Unable to create cabinet"); done(err); return; } 

Такая же проблема в схеме вашего кабинета:

 if (err) cb(err,null); 

Для этого требуется возврат, или он вызовет обратный вызов дважды и вызовет хаос (также ласково известный среди блогосферы node.js как один из вариантов «выпуска Zalgo»).