En bref, vous n'avez pas besoin d'un conteneur d'injection de dépendance ou d'un service de localisation comme vous le feriez en C#/Java. Depuis Node.js, tire parti de l' module pattern
, il n'est pas nécessaire d'effectuer constructeur ou des biens de l'injection. Bien que vous le pouvez encore.
La grande chose à propos de JS, c'est que vous pouvez modifier à peu près tout pour obtenir ce que vous voulez. C'est pratique quand il s'agit de tester.
Voici ma très boiteux exemple artificiel.
MyClass.js
:
var fs = require('fs');
MyClass.prototype.errorFileExists = function(dir) {
var dirsOrFiles = fs.readdirSync(dir);
for (var d in dirsOrFiles) {
if (d === 'error.txt') return true;
}
return false;
};
MyClass.test.js
:
describe('MyClass', function(){
it('should return an error if error.txt is found in the directory', function(done){
var mc = new MyClass();
assert(mc.errorFileExists('/tmp/mydir')); //true
});
});
Remarquez comment MyClass
dépend de l' fs
module? @ShatyemShekhar mentionné, vous pouvez le faire en effet, le constructeur ou bien à l'injection dans d'autres langues. Mais il n'est pas nécessaire en Javascript.
Dans ce cas, vous pouvez faire deux choses.
Vous pouvez stub l' fs.readdirSync
méthode ou vous pouvez revenir un tout autre module lorsque vous appelez require
.
Méthode 1:
var oldmethod = fs.readdirSync;
fs.readdirSync = function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
*** PERFORM TEST ***
*** RESTORE METHOD AFTER TEST ****
fs.readddirSync = oldmethod;
Méthode 2:
var oldrequire = require
require = function(module) {
if (module === 'fs') {
return {
readdirSync: function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
};
} else
return oldrequire(module);
}
La clé est de tirer parti de la puissance de Node.js et Javascript. Remarque, je suis un CoffeeScript gars, mon JS syntaxe est peut-être incorrect quelque part. Aussi, je ne dis pas que c'est la meilleure façon, mais c'est une façon. Javascript gourous pourriez être en mesure de carillon avec d'autres solutions.
Mise à jour:
Cela devrait répondre à votre question spécifique concernant les connexions de base de données. J'aimerais créer un module séparé pour votre pour encapsuler votre connexion de base de données logique. Quelque chose comme ceci:
MyDbConnection.js
: (assurez-vous de choisir un meilleur nom)
var db = require('whichever_db_vendor_i_use');
module.exports.fetchConnection() = function() {
//logic to test connection
//do I want to connection pool?
//do I need only one connection throughout the lifecyle of my application?
return db.createConnection(port, host, databasename); //<--- values typically from a config file
}
Ensuite, un module qui a besoin d'une connexion de base de données seraient alors il suffit d'inclure votre MyDbConnection
module.
SuperCoolWebApp.js
:
var dbCon = require('./lib/mydbconnection'); //wherever the file is stored
//now do something with the connection
var connection = dbCon.fetchConnection(); //mydbconnection.js is responsible for pooling, reusing, whatever your app use case is
//come TEST time of SuperCoolWebApp, you can set the require or return whatever you want, or, like I said, use an actual connection to a TEST database.
Ne suivez pas cet exemple verbatim. C'est un piètre exemple pour essayer de communiquer que vous tirer parti de l' module
modèle pour la gestion de vos dépendances. Espérons que cela aide un peu plus.