2014-01-21 5 views
1

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

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); 
    }); 
}; 
+0

Я пришел сюда из-за символа ** â ** (a + circumflex), который появляется в сообщении «should». Я узнал, что я не установил вывод моей консоли (в моем случае Git Bash под Windows 10) в UTF-8, где этот символ будет выглядеть как галочка: ** √ ** – Fuhrmanator

ответ

2

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

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

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

if (err) cb(err,null); 

Это требует возврата или он будет вызывать функцию обратного вызова дважды и вызвать хаос (также ласково называют среди Node.js блогосфере как один вкус " выпуская Zalgo ").

+0

Изменение одной из схем как вы предложили, я смог выполнить эту работу: 'cabinetSchema.statics.isAuthorizedBorrower = function (cabinet_id, заемщик, cb) { this.findOne ({_ id: cabinet_id}, function (err, cabinet) { if (ERR) центибар (эээ, нуль); если (hasBorrower (кабинет, borrowername!)) { центибар (новый Error (errorMsgs.borrowerNotAuthorized), нуль); возвращение; } центибар (нуль, borrowername); }); }; ' –

+0

Не могу сказать, что в это время я понимаю * почему * - tho также за ваши комментарии Я буду внимательно читать эту статью: http: //blog.izs.me/post/59142742143/designing- АПИС-для-асинхронности –

Смежные вопросы