2015-11-18 19 views
6

Ich bin Fragen schriftlich Unit-Test für die folgende Konfiguration als jira.js Datei (in einem node.js Modul) mit:Knoten js Testeinheit: spöttische erfordern Abhängigkeit

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; 
}; 

Nun, ich will schreiben Unit-Test für meine getIssue-Funktion. 'restler' ist ein REST-Client, über den ich REST-Aufrufe an die JIRA-API mache, um ein JIRA-Problem über meinen Code zu bekommen.

Um also createIssue (..) testen zu können, möchte ich in der Lage sein, die "Ruhe" Var in meinen Jasmine Unit Tests zu verspotten.

Wie kann ich diese Methode verspotten? Bitte gib mir ein paar Hinweise, damit ich weitermachen kann. Ich habe versucht, rewire aber ich habe versagt.

Das ist, was ich bisher habe, die nicht funktioniert (dh getIssue Methode erweist sich als nicht definiert werden.):

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.stringify(this)); 

    }, 
    postJson : function (url, data, options) { 
     console.log('[restler] POST url='+url+', data= '+JSON.stringify(data)+ 
     'options='+JSON.stringify(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.stringify(options)); 
    }, 
    del : function (url, options) { 
     console.log('[restler] DELETE url='+url+'options='+JSON.stringify(options)); 
    }, 
    putJson : function (url, data, options) { 
     console.log('[restler] PUT url='+url+', data= '+JSON.stringify(data)+ 
     'options='+JSON.stringify(options)); 
    } 
}; 

var cfgMock = { 
    "test" : "testing" 
}; 

jiraModule.__set__("rest", restMock); 
jiraModule.__set__("cfg", cfgMock); 

console.log('mod='+JSON.stringify(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.stringify(result)); 
    }); 

    expect(true).toBe(true); 
}); 
}); 

Wenn jemand auf mich leiten kann, wie man die ‚Ruhezeit‘ erfordern verspotten Abhängigkeit & Unit-Test diese Methode, die sehr hilfreich sein wird.

Wie sollte ich auch das 'conf' verspotten, das an module.exports übergeben wird?

dank

Antwort

5

Sie proxyquire oder mockery die Abhängigkeiten Stummel/verspotten nutzen könnten. Im folgenden Beispiel habe ich proxyquire verwendet. Ich hoffe es hilft.


/* ./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" 
    } 
} 
+0

Jasmin-Knoten markiert ist, warum Sie Mokka verwenden? –

+0

Opps, habe ich nicht bemerkt, aber die Abhängigkeit zu spotten hat nichts mit dem Test-Framework zu tun. – sarbbottam

+0

Hallo, danke für die Anleitung !! Wie gebe ich das Conf weiter, wenn ich Proxyquire verwende? Ich muss auch Conf config ... was als ein Argument von module.exports genommen wird .. – Rookie