test d’unité de noeud js: le mocking nécessite une dépendance

J’ai des problèmes pour écrire le test unitaire pour la configuration suivante en tant que fichier jira.js (dans un module node.js):

var rest = require('restler'); // https://www.npmjs.com/package/restler module.exports = function (conf) { var exported = {}; exported.getIssue = function (issueId, done) { ... rest.get(uri).on('complete', function(data, response) { ... }; return exported; }; 

Maintenant, je veux écrire un test unitaire pour ma fonction getIssue. ‘restler’ est un client REST via lequel je passe des appels REST à l’API JIRA pour obtenir un problème JIRA via mon code.

Donc, pour pouvoir tester createIssue (..), je veux pouvoir me moquer de la variable ‘rest’ dans mes tests unitaires Jasmine.

Comment puis-je me moquer de cette méthode? S’il vous plaît donnez-moi des indications pour que je puisse continuer. J’ai essayé d’utiliser rewire mais j’ai échoué.

C’est ce que j’ai jusqu’à présent qui ne fonctionne pas (c.-à-d. La méthode getIssue s’avère non définie):

 var rewire = require("rewire"); var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); var cfg = require("../../../config.js").Configuration; var jiraModule = rewire("../lib/jira")(cfg); var sinon = require("sinon"); var should = require("should"); // https://github.com/danwrong/restler var restMock = { init : function () { console.log('mock initiated'+JSON.ssortingngify(this)); }, postJson : function (url, data, options) { console.log('[restler] POST url='+url+', data= '+JSON.ssortingngify(data)+ 'options='+JSON.ssortingngify(options)); emitter.once('name_of_event',function(data){ console.log('EVent received!'+data); }); emitter.emit('name_of_event', "test"); emitter.emit('name_of_event'); emitter.emit('name_of_event'); }, get : function (url, options) { console.log('[restler] GET url='+url+'options='+JSON.ssortingngify(options)); }, del : function (url, options) { console.log('[restler] DELETE url='+url+'options='+JSON.ssortingngify(options)); }, putJson : function (url, data, options) { console.log('[restler] PUT url='+url+', data= '+JSON.ssortingngify(data)+ 'options='+JSON.ssortingngify(options)); } }; var cfgMock = { "test" : "testing" }; jiraModule.__set__("rest", restMock); jiraModule.__set__("cfg", cfgMock); console.log('mod='+JSON.ssortingngify(jiraModule.__get__("rest"))); describe("A suite", function() { it("contains spec with an expectation", function() { restMock.init(); restMock.postJson(null, null, null); console.log(cfg.jira); // the following method turns out to be undefined but when i console.log out the jiraModule, i see the entire code outputted from that file jiraModule.getIssue("SRMAPP-130", function (err, result) { console.log('data= '+JSON.ssortingngify(result)); }); expect(true).toBe(true); }); }); 

Si quelqu’un peut me guider sur la façon de se moquer du «repos», demandez à la dépendance et testez à l’unité cette méthode qui sera très utile.

Aussi, comment devrais-je me moquer de la ‘conf’ étant transmise à module.exports?

Merci

Vous pouvez utiliser proxyquire ou mockery pour remplacer les dépendances.

Dans l’exemple ci-dessous, j’ai utilisé proxyquire . J’espère que ça aide.


 /* ./src/index.js */ var rest = require('restler'); module.exports = function (conf) { var exported = {}; exported.getIssue = function (issueId, done) { var uri = ''; var reqObj = ''; var service = { auth : '' }; rest.postJson(uri, reqObj, service.auth).on('complete', function(data, response) { done(data, response); }); }; return exported; }; 

 /* ./test/index.js */ var proxyquire = require('proxyquire'); var assert = require('chai').assert; var restlerStub = { postJson: function() { return { on: function(event, callback) { callback('data', 'response'); } } } } var index = proxyquire('../src/index', {'restler': restlerStub})(); describe('index', function() { it('should return the desired issue', function(done) { var issue = index.getIssue('issueId', function(data, response) { assert.equal(data, 'data'); assert.equal(response, 'response'); done(); }) }); }); 

 /* ./package.json */ { "scripts": { "test": "mocha" }, "dependencies": { "restler": "^3.4.0" }, "devDependencies": { "chai": "^3.4.1", "mocha": "^2.3.4", "proxyquire": "^1.7.3" } }