2014-09-05 10 views
6

का उपयोग कर एक कन्स्ट्रक्टर पर जासूस मैं एक कन्स्ट्रक्टर फ़ंक्शन पर जासूसी करना चाहता हूं और बताता हूं कि इसे जैस्मीन का उपयोग करके कितनी बार बुलाया गया है।जैस्मीन

spyOn(lib,'methodName') 

लेकिन मामले में मैं वास्तव में निर्माता तो मैं कोशिश की है पर जासूसी करने के कोशिश कर रहा हूँ:

spyOn(lib); 


it('lib should be instantiated for each matching element', function() { 
    spyOn(lib); 
    expect(lib.calls.count()).toEqual(2); 
}); 

मैं आमतौर पर एक वस्तु की एक विधि को लक्षित करने के कुछ इस तरह करते हैं चाहते हैं दुर्भाग्य से यह मुझे कंसोल में एक त्रुटि देता है:

"Error: undefined() method does not exist in ..." 

मैं कन्स्ट्रक्टर पर जासूसी कैसे कर सकता हूं?

+2

'spyOn (खिड़की, 'lib') के साथ प्रयास करें' – javiyu

+0

उपयोग 'lib.callCount' की [जैस्मीन – inf3rno

+0

संभव डुप्लिकेट - पर जासूसी एक कन्स्ट्रक्टर के भीतर एक विधि कॉल] (http://stackoverflow.com/questions/8733978/jasmine-spying-on-a-method-call-within-a-constructor) –

उत्तर

11

spyOn() फ़ंक्शन केवल ऑब्जेक्ट गुणों को प्रतिस्थापित कर सकता है, इसलिए केवल एक चीज जो आप कर सकते हैं प्रोटोटाइप पर जासूसी कर रही है। अब यदि आप असली कक्षा के प्रोटोटाइप पर जासूसी करेंगे, तो यह अन्य परीक्षणों में हस्तक्षेप करेगा, इसलिए आपको प्रोटोटाइप विरासत का उपयोग करना होगा।

var mockClass = function (Subject) { 
    var Surrogate = function() { 
     Surrogate.prototype.constructor.apply(this, arguments); 
    }; 
    Surrogate.prototype = Object.create(Subject.prototype); 
    Surrogate.prototype.constructor = Subject; 
    return Surrogate; 
}; 

कुछ परीक्षण:

var My = function (a) { 
    this.init(a); 
}; 
My.prototype = { 
    init: function (a) { 
     this.setA(a); 
    }, 
    setA: function (a) { 
     this.a = a; 
    } 
}; 

var Mock = mockClass(My); 
spyOn(Mock.prototype, "constructor").andCallThrough(); 
spyOn(Mock.prototype, "init"); 

var m = new Mock(1); 

expect(Mock.prototype.init).toBe(m.init); 
expect(My.prototype.init).not.toBe(m.init); 
expect(m.constructor).toHaveBeenCalledWith(1); 
expect(m.init).toHaveBeenCalledWith(1); 
expect(m.a).toBeUndefined(); 
m.setA(1); 
expect(m.a).toBe(1); 

spyOn(Mock.prototype, "setA").andCallFake(function (a) { 
    this.a = a + 1; 
}); 
m.setA(1); 
expect(m.setA).toHaveBeenCalledWith(1); 
expect(m.a).toBe(2); 

आप अपने कोड एक x.constructor आधारित प्रकार की जाँच का उपयोग करता है, तो constructor पर जासूसी नहीं कर सकते

आप कुछ इस तरह कर सकते हैं। लेकिन मुझे लगता है यह बुरी तरह से तैयार किया गया कोड द्वारा एकीकरण परीक्षणों से तभी हो सकता है, और ...