2016-11-04 12 views
5

के साथ इंटरसेप्ट इवेंटइमीटर, मैं एक node.js मॉड्यूल का निर्माण कर रहा हूं और मैं इसे जैस्मीन के साथ परीक्षण करना चाहता हूं।जैस्मीन

माना कि मेरी मॉड्यूल कुछ ऐसा दिखाई:

var myModule = function (foo, bar) { 

    // Begin a workflow 
    var workflow = new (require('events').EventEmitter)(); 

    workflow.on('test', function() { 
    var greet = greet(); 
    return greet; 
    }); 

    workflow.emit('test'); 

}; 

function greet() { 
    return "Hi!"; 
} 

module.exports = { 
    myModule: myModule 
}; 

मैं कैसे जैस्मीन मेरे सारे घटनाक्रम मैं फेंकना को निशाना बनाने के साथ अपने मॉड्यूल परीक्षण कर सकते हैं?

कुछ इस तरह:

var myModule = require('../myModule.js');  

describe('My Module test', function() { 

    it('should get greet value', function() { 
    myModule.on('test', function() { // "test" as I wrote in myModule 
     expect(myModule.greet).toHaveBeenCalled(); 
    }); 
    }); 
}); 

उत्तर

0

मैं इस का उपयोग कर proxyquire पूरा:

var proxyquire = require('proxyquire'); 
var mockEvents = {}; 
var myModule = proxyquire('../myModule.js', { 
    events: mockEvents 
}); 

describe('My Module test', function() { 
    beforeEach(function() { 
    mockEvents.EventEmitter = function() {}; 

    mockEvents.EventEmitter.prototype = { 
     on: function() { }, 
     emit: function() { } 
    }; 

    spyOn(mockEvents.EventEmitter.prototype, 'on'); 
    spyOn(mockEvents.EventEmitter.prototype, 'emit'); 
    }); 

    it('should get greet value', function() { 
    myModule() 
    expect(mockEvents.EventEmitter.prototype.on).toHaveBeenCalledWith('test'); 
    expect(mockEvents.EventEmitter.prototype.emit).toHaveBeenCalledWith('test'); 
    }); 
}); 

आप भी अपने नकली EventEmitter, आदि के रूप में एक जासूस का उपयोग कर सकते हैं: https://github.com/thlorenz/proxyquire

अपने परीक्षण फ़ाइल में

+0

हाय, आपके उत्तर के लिए धन्यवाद, क्या मैं एक और विस्तृत उदाहरण पूछ सकता हूं? मैं यूनिट परीक्षण दुनिया में नया हूं और इसे बेहतर समझना अच्छा लगेगा ... –

+0

यह सुनिश्चित नहीं है कि वह उदाहरण पूरी तरह से काम करता है, क्योंकि मैंने अभी इसे इनलाइन लिखा है। लेकिन आपको इसे पढ़ना चाहिए: http://jasmine.github.io/2.5/introduction और प्रॉक्सीक्वायर पर दस्तावेज़ भी। –

+0

जितनी जल्दी हो सके मैं इसका परीक्षण करूंगा और आपको बता दूंगा। धन्यवाद –

0

मुख्य समस्या यह है कि greet वास्तव में खुलासा नहीं किया गया है और इसलिए परीक्षणों में उपलब्ध नहीं है। इसे संभालने के कुछ तरीके यहां दिए गए हैं:

  1. इसे सुलभ बनाने के लिए प्रोटोटाइप श्रृंखला में जोड़ें (यह मैंने नीचे किया है)।

  2. module.exports में फ़ंक्शन का पर्दाफाश करें। इसे उत्पादन से बाहर करने के लिए process.env.NODE_ENV !== production में लपेटा जा सकता है।

  3. इसका खुलासा न करें, लेकिन ईवेंट एमिटर कार्यक्षमता और फ़ंक्शन के प्रभाव का परीक्षण करें (यह शायद आदर्श नहीं है)।

प्राप्त करने के लिए आप क्या चाहते हैं, तो आप बंदर कार्य करता है और परीक्षण पैच सकता है कि वे बुलाया गया है और greet का परिणाम अलग-अलग परीक्षण:

MyModule.js

var EventEmitter = require('events').EventEmitter; 
var MyModule = function (foo, bar) { 
    // Begin a workflow 
    var workflow = new EventEmitter(); 

    workflow.on('test', function() { 
    return this.greet(); 
    }.bind(this)); 

    workflow.emit('test'); 
}; 

MyModule.prototype.greet = function() { 
    return "Hi!"; 
}; 

module.exports = MyModule; 

MyModule-test.js

var EventEmitter = require('events').EventEmitter; 

describe('MyModule', function() { 
    it('emits an event upon construction', function() { 
    // Monkey patch 
    var originalEventEmitterOn = EventEmitter.prototype.on; 
    EventEmitter.prototype.on = jasmine.createSpy('on'); 

    // Create module 
    var MyModule = require('./MyModule'); 
    new MyModule(); 
    expect(EventEmitter.prototype.on).toHaveBeenCalled(); 

    // Reset 
    EventEmitter.prototype.on = originalEventEmitterOn; 
    }); 

    it('calls greet upon construction', function() { 
    var MyModule = require('./MyModule'); 

    // Monkey patch 
    var originalGreet = MyModule.prototype.greet 
    MyModule.prototype.greet = jasmine.createSpy('greet'); 

    var myModule = new MyModule(); 
    expect(myModule.greet).toHaveBeenCalled(); 

    // Reset 
    MyModule.prototype.greet = originalGreet; 
    }); 

    it('returns "Hi!"', function() { 
    var MyModule = require('./MyModule'); 
    var myModule = new MyModule(); 
    expect(myModule.greet()).toBe("Hi!"); 
    }); 
});