2012-11-23 36 views
25

मैं सफल होने के लिए परीक्षण निर्धारित करने की आवश्यकता है, तो दो उम्मीदों में से एक पूरा किया जाता है:जैस्मीन उम्मीद तर्क (उम्मीद ए या बी)

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)); 
expect(mySpy.mostRecentCall.args[0]).toEqual(false); 

मैं यह उम्मीद इस तरह देखने के लिए:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)).or.toEqual(false); 

क्या मुझे दस्तावेज़ों में कुछ भी याद आया है या क्या मुझे अपना खुद का मैचर लिखना है?

+0

मैंने प्रलेखन की जांच की और मैंने कुछ कोड की कोशिश की, लेकिन मुझे लगता है कि हम "आसानी से" क्षमा नहीं कर सकते हैं। लेकिन जो मैंने पाया है उसके अनुसार, आप अपना खुद का "चेन करने योग्य" मैचर बना सकते हैं। – Magus

उत्तर

10

नोट: इस समाधान में जैस्मीन v2.0 से पहले संस्करणों के लिए वाक्यविन्यास शामिल है। कस्टम matchers अधिक जानकारी के लिए अब, देखें: https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js एक 'परिणाम संशोधक' के साथ काम करता केवल - not:

कोर/Spec.js:

jasmine.Spec.prototype.expect = function(actual) { 
    var positive = new (this.getMatchersClass_())(this.env, actual, this); 
    positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); 
    return positive; 

कोर/Matchers.js:

jasmine.Matchers = function(env, actual, spec, opt_isNot) { 
    ... 
    this.isNot = opt_isNot || false; 
} 
... 
jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { 
    return function() { 
    ... 
    if (this.isNot) { 
     result = !result; 
    } 
    } 
} 

तो ऐसा लगता है कि आपको वास्तव में this के लिए before या it ब्लॉक के भीतर अपना खुद का मैचर लिखना होगा। उदाहरण के लिए:

this.addMatchers({ 
    toBeAnyOf: function(expecteds) { 
     var result = false; 
     for (var i = 0, l = expecteds.length; i < l; i++) { 
     if (this.actual === expecteds[i]) { 
      result = true; 
      break; 
     } 
     } 
     return result; 
    } 
}); 
+1

मुझे बस इतना चाहिए कि 'कोई मल्टी मैचों नहीं हैं', यह जवाब बहुत अधिक है! :) कोड के लिए धन्यवाद। मुझे नहीं लगता कि यह 'jasmine.any (संख्या)' मामला संभालता है, लेकिन मैं इसे काम कर सकता हूं। अगर आपको कोई फर्क नहीं पड़ता तो मैं इसे आपके जवाब में डाल दूंगा। – naugtur

10

यह एक पुराना सवाल है, लेकिन यदि कोई अभी भी देख रहा है तो मेरे पास दूसरा जवाब है।

तार्किक या अभिव्यक्ति बनाने और बस इसकी अपेक्षा करने के बारे में कैसे? इस तरह:

var argIsANumber = !isNaN(mySpy.mostRecentCall.args[0]); 
var argIsBooleanFalse = (mySpy.mostRecentCall.args[0] === false); 

expect(argIsANumber || argIsBooleanFalse).toBe(true); 

इस तरह, आप स्पष्ट रूप से परीक्षण कर सकते हैं/या हालत उम्मीद करते हैं, और तुम सिर्फ जैस्मीन उपयोग करने के लिए एक बूलियन मैच/बेमेल के लिए परीक्षण करने के लिए की जरूरत है। जैस्मीन 1 या जैस्मीन 2 में काम करेगा :)

18

एक सरणी में एकाधिक तुलनीय तार जोड़ें और फिर तुलना करें। तुलना के क्रम को उलट दें।

expect(["New", "In Progress"]).toContain(Status); 
+0

महान विचार, बहुत संक्षिप्त! और 'अपेक्षा (स्थिति == "नई" || स्थिति == "प्रगति में") से अधिक स्पष्ट त्रुटि संदेश देता है। Toee (true); ' –