В моем узле приложении, есть конфигурационный файл, как это:Не изменяя груженый узел модуля
module.exports = {
BUILD_DIR: '/some.path',
OTHER_CONFIG: 42,
// ...
};
У меня также есть некоторые тесты, делать такие вещи, как
var appConfig = require('./path/to/appConfig');
appConfig.BUILD_DIR = 'tmp/some/path';
// and stuff done with appConfig
К моему большому удивлению, делая это, по-видимому изменяет состояние модуля. Мой следующий тест, который требует этого, будет иметь BUILD_DIR
, установленный в 'tmp/some/path'. Я не понимал, что модули требуют такого состояния. Как мне избавиться от этого эффекта в моем тесте? Кроме того, как я могу запретить людям изменять состояние этого модуля? Если кто-то включает его, они всегда должны получать то, что он определяет, и, возможно, что-то еще не написал какой-то другой код.
Это на самом деле не работает, я до сих пор в конечном итоге с моей модификации, показывая в моем другом тесте. Если я делаю «return extend ({}, {..config ..})» в функции, то это действительно работает. –
Я протестировал его, и он работает для меня ([gist] (https://gist.github.com/robertklep/c58a3da939d6c18d07aa)). Он должен, потому что объект, возвращаемый функцией, вновь создается каждый раз, когда вызывается функция, даже если сама функция кэшируется. – robertklep
Ах, действительно. Я помещал конфигурацию в var, а затем возвращал ее через функцию. Выполнение этого за один шаг работает так, как рекламируется. –