2013-02-12 15 views
46

मैंने toHaveBeenCalledWith मैचर के जैस्मीन के दस्तावेज़ीकरण की समीक्षा करने के लिए समीक्षा की है ताकि यह तर्क हो सके कि तर्क के लिए नियमित अभिव्यक्ति में गुजरना संभव है, यदि वह तर्क एक स्ट्रिंग होने की उम्मीद है। दुर्भाग्यवश, यह असमर्थित कार्यक्षमता है। इस कार्यक्षमता का अनुरोध करने के लिए issue open on github भी है।क्या जैस्मीन के टूहेवबिनकॉलड का उपयोग नियमित अभिव्यक्ति के साथ मैचर के साथ करना संभव है?

मैंने कोडबेस में थोड़ा सा खोला है, और मुझे लगता है कि existing matcher के अंदर इसे कार्यान्वित करना संभव हो सकता है। मुझे लगता है कि इसे एक अलग matcher के रूप में लागू करने के लिए और अधिक उपयुक्त होगा, ताकि अमूर्त व्यक्तिगत रूप से कब्जा कर लिया जा सके।

इस बीच, एक अच्छा कामकाज क्या हो सकता है?

उत्तर

68

कुछ खुदाई करने के बाद, मुझे पता चला है कि Jasmine spy वस्तुओं एक calls संपत्ति, जो बारी में एक mostRecent() कार्य है की है। इस फ़ंक्शन में एक बच्चे की संपत्ति args भी है, जो कॉल तर्कों की एक सरणी देता है।

इस प्रकार, एक, कॉल तर्क पर एक regexp मैच प्रदर्शन करने के लिए निम्न क्रम का उपयोग कर सकते हैं जब एक ही है कि स्ट्रिंग तर्क एक विशिष्ट रेगुलर एक्सप्रेशन से मेल चेक करना चाहता है:

var mySpy = jasmine.createSpy('foo'); 
mySpy("bar", "baz"); 
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/); 

सुंदर सरल।

11

वैकल्पिक रूप से, आप एक वस्तु पर एक विधि पर जासूसी कर रहे हैं:

spyOn(obj, 'method'); 
obj.method('bar', 'baz'); 
expect(obj.method.argsForCall[0][0]).toMatch(/bar/); 
expect(obj.method.argsForCall[0][1]).toMatch(/baz/); 
+5

जैस्मीन 2.0 में, वाक्यविन्यास 'obj.method.calls.argsFor (अनुक्रमणिका)', अभी भी एक ऐरे होगा। – Dr1Ku

21

जैस्मीन 2.0 signature changed a bit में। यहां यह होगा:

var mySpy = jasmine.createSpy('foo'); 
mySpy("bar", "baz"); 
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/); 

और Documentation for Jasmine 1.3 स्थानांतरित हो गया है।

6

जैसा कि जैमन ने उल्लेख किया है, जैस्मीन 2.0 हस्ताक्षर बदल गया है। आप जैस्मीन 2.0 में एक वस्तु की विधि पर जासूसी कर रहे हैं, निक के समाधान की तरह कुछ का उपयोग करने के बदला जाना चाहिए -

spyOn(obj, 'method'); 
obj.method('bar', 'baz'); 
expect(obj.method.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(obj.method.calls.mostRecent().args[1]).toMatch(/baz/); 
2

कभी कभी यह यह इस तरह से लिखने के लिए और अधिक पठनीय है:

spyOn(obj, 'method').and.callFake(function(arg1, arg2) { 
    expect(arg1).toMatch(/bar/); 
    expect(arg2).toMatch(/baz/); 
}); 
obj.method('bar', 'baz'); 
expect(obj.method).toHaveBeenCalled(); 

यह

3

जैस्मीन 2.2 के रूप में (बजाय सरणी का उपयोग करने का) विधि तर्कों की और अधिक स्पष्ट दृश्यता देने के लिए, आप jasmine.stringMatching उपयोग कर सकते हैं:

var mySpy = jasmine.createSpy('foo'); 
mySpy('bar', 'baz'); 
expect(mySpy).toHaveBeenCalledWith(
    jasmine.stringMatching(/bar/), 
    jasmine.stringMatching(/baz/) 
); 
संबंधित मुद्दे