Принудительная ошибка Mongodb для модульного тестирования в NodeJS
Я пишу свои первые тесты для базы данных Mongodb с использованием must.js, и мне нужен способ вызывать ошибки в различных функциях, которые делают вызовы базы данных.
Я потратил немного времени на изучение того, как может помочь Rewire.js, но я все еще новичок в Mongo, поэтому я не уверен, что мне следует "перепрограммировать", чтобы вызвать ошибки базы данных.
Возможно, есть лучший способ написания функций для запуска ошибок во время тестирования.
Я ценю любые идеи.
Для чего это стоит, это то, что я придумал и был бы признателен за любые комментарии. У меня не было много времени, чтобы написать это, поэтому, пожалуйста, прости любые опечатки.
Типичное расположение функции со встроенным асинхронным вызовом обычно выглядит примерно так:
function my_function(callback) {
async_call(function(err, doc) {
if (err) {
//Do error prep such as with VError
callback(err, null);
} else {
//Do success prep such as:
var result = doc.property;
callback(null, result);
}
});
}
Проблема в том, что у вас есть отличный способ проверить код на пути ошибки. Существуют такие решения, как Rewire, которые хорошо работают, если, изменяя значение глобальной переменной, вы можете вызвать нужную ошибку, но сложно найти способ прервать вызовы Mongodb, переписав глобальную переменную.
Мое решение было: 1) переписать мои асинхронные функции, которые мне нужно "сломать", чтобы проверить
my_function = {
get: function(callback) {
async_call(function(err, doc) {
my_function.manage_return(err, doc, callback);
});
},
manage_return: function(err, doc, callback) {
if (err) {
//Do error prep such as with VError
callback(err, null);
} else {
//Do success prep such as:
var result = doc.property;
callback(null, result);
}
});
}
2) Во время тестирования, если мне нужно вызвать ошибку, я просто переписываю get:
var original_get = my_lib.my_function.get; //NO parenthesis!!!
my_lib.my_function.get = function(callback) {
my_lib.my_function.manage_return("This is a forced error", null, callback);
};
Позже, если мне нужно восстановить функцию:
my_lib.my_function.get = original_get;
На самом деле я написал конструктор, который делает процедуру перезаписи / восстановления более упрощенной, и я был бы рад опубликовать ее, если кому-то будет интересно.
Я попытался использовать Rewire для выполнения процедуры перезаписи / восстановления без успеха. Хуже того, "переписанный" код не может быть пошаговым.
ПРОФИ
* Не использует eval
* Отладка в один шаг (по крайней мере, в WebStorm) работает
* Может вызвать любую ошибку по желанию
* Не меняет сигнатуру функции
* Дает возможность принудительно вызвать сбой определенной функции, что очень помогает при тестировании обработки ошибок более крупных функций, которые полагаются на несколько подчиненных функций.
МИНУСЫ
* Я должен переписать все мои асинхронные функции как объекты с помощью get и mange_return
* Если функция находится в модуле, я должен экспортировать функцию, чтобы переписать / восстановить ее
Мысли?