NodeJS require не кэширует ни одного отдельного файла

#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.