2015-11-18 17 views
6

I (a node.js modülünde) bir jira.js dosyası olarak aşağıdaki kurulum için birim testi yazma sorunlarınız duyuyorum: Artıkdüğümün js birim testi: gerektiren alay bağımlılık

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

i yazmak istiyorum getIssue işlevim için birim testi. 'restler', bir JIRA sorununu kodum aracılığıyla almak için JIRA API'sine REST çağrıları yaptığım bir REST istemcisidir.

createIssue (..) 'yı test edebilmek için Jasmine birim testlerimde' rest 'varyantıyla dalga geçmek istiyorum.

Bu yöntemle nasıl baş edebilirim? Lütfen devam edebilmek için bana bazı işaretçiler verin. Rewire kullanmayı denedim ama başarısız oldum. (. Yani getIssue yöntemi tanımlanmamış çıkıyor): Birisi 'kalanını' alay nasıl bana yol Eğer

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

bağımlılık & gerektiren

Bu

i şimdiye kadar çalışmıyor hangi ne var birim çok yararlı olacak bu yöntemi test edin.

Ayrıca, 'conf' modül.exports'a iletilmek zorunda kalmamalıyım? Sen/proxyquire veya mockery saplama için kullanmak bağımlılıkları alay olabilir

sayesinde

cevap

5

.

Aşağıdaki örnekte proxyquire kullandım. Umarım yardımcı olur.


/* ./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

Yasemin-düğüm neden mocha kullanırken, etiketlenmiş? –

+0

Opps, Dikkatim, bağımlılığın alay etmesinin test çerçevesiyle ilgisi yoktur. – sarbbottam

+0

Merhaba, rehberlik için teşekkürler! Proxyquire kullanıyorum eğer conf nasıl geçebilirim? Modül.exports tarafından bir argüman olarak ele alındığı gibi, aynı zamanda alay etmek zorundayım .. – Rookie