#node.js #unit-testing #caching #require
#node.js #модульное тестирование #кэширование #требуется
Вопрос:
После почти полного завершения моего ИТ-проекта я попытался добавить модульное тестирование, как указано в спецификациях (да, я знаю, что технически это неправильный порядок). Для этого я использую mocha
в сочетании с chai
, chai-http
и sinon
. Все шло хорошо, пока я не попытался стереть файл своей базы данных bindatabase.js
во время тестирования маршрутов. Это минимальный рабочий пример файла базы данных:
/* jshint esversion: 6, node: true */
'use strict';
console.log('loaded'); // For verifying that the cache doesn't work
function def(some, callback) {
callback();
}
function defArray(some, callback) {
callback(undefined, []);
}
function defNumber(some, callback) {
callback(undefined, 0);
}
module.exports = {
Category: function() {},
addCategory: def,
modifyCategory: def,
removeCategory: def,
getCategories: defArray,
getCategory: def,
countCategories: defNumber,
Question: function() {},
addQuestion: def,
modifyQuestion: def,
answeredQuestion: def,
removeQuestion: def,
getQuestions: defArray,
getQuestion: def,
countQuestions: defNumber,
Highscore: function() {},
addHighscore: def,
removeHighscore: def,
getHighscores: defArray,
highscoreSort(a, b) {
return a.name < b.name ? -1 : 1;
},
countHighscores: defNumber
};
Код, использующий sinon, выглядит следующим образом:
before(function() {
sinon.stub(database, 'getCategories', function(filter, callback) {
setTimeout(function() {
console.log('getCategories');
callback(null, []);
}, 30);
});
sinon.stub(database, 'getQuestions', function(filter, callback) {
setTimeout(function() {
console.log('getQuestions');
callback(null, []);
}, 30);
});
});
afterEach(function() {
database.getCategories.reset();
database.getQuestions.reset();
});
after(function() {
database.getCategories.restore();
database.getQuestions.restore();
});
Если я сейчас запущу тесты mocha с set NODE_ENV=testing amp; mocha --watch
(тестовый файл, являющийся testtest-routes.js не обращайте внимания на переменную env, это для меньшего беспорядка в консоли), она отлично работает при первом запуске, печатая «getQuestions» и «GetCategories», где вызывается get:
routes
admin route
GET requests
√ should redirect from /admin to /admin/home (542ms)
√ answers correctly on GET to/admin/home (231ms)
getCategories
√ answers correctly on GET to/admin/category (696ms)
getCategories
getQuestions
√ answers correctly on GET to/admin/question (584ms)
√ answers correctly on GET to/admin/highscore (299ms)
Однако, когда --watch
происходит сбой после того, как я что-то изменил в тестовом файле, они отсутствуют в выходных данных. Кроме того, это, похоже, единственный файл, который вообще не кэшируется, проверяется следующим образом:
console.log(Object.keys(require.cache).length);
var database = require('../bin/database');
console.log(Object.keys(require.cache).length);
var server = require('../bin/www');
var chai = require('chai');
var chaiHTTP = require('chai-http');
var expect = chai.expect;
var sinon = require('sinon');
console.log(Object.keys(require.cache).length);
В первый раз это выводит 72
, 73
и 354
. При дальнейших вызовах выводится 539
, 540
и 540
, что указывает на то, что bindatabase.js
не было кэшировано.
Кто-нибудь может предоставить дополнительную информацию о том, что может вызвать такое поведение? Я не очищаю кэш вручную ни в одном другом файле, поскольку это единственный файл, который это делает.
Я использую node версии 6.8.1 с mocha 3.1.2, sinon 1.17.6 и chai 3.5.0.