2015-02-26 12 views
11

में आइटम की अपेक्षा करें मेरे परीक्षण में से एक त्रुटि संदेश पाठ को कई मानों में से एक होने की अपेक्षा करता है। चूंकि getText() एक वचन देता है मैं toContain() जैस्मीन मैचर का उपयोग नहीं कर सकता।सरणी

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText()); 

प्रश्न:: निम्नलिखित के बाद से protractor (jasminewd अंडर-हुड) इस मामले में मिलान, toContain() के दूसरे भाग में एक वादा का समाधान नहीं होगा कार्य नहीं करेगा वहाँ जाँच करने के लिए एक रास्ता है यदि कोई तत्व जैस्मीन + प्रोटैक्टर के साथ एक सरणी में है जहां एक तत्व एक वादा है?

दूसरे शब्दों में, मैं toContain() का प्रतिलोम के लिए देख रहा हूँ ताकि expect() परोक्ष वादा में पारित हल होगा


समाधान के लिए, मैं स्पष्ट रूप से then() साथ वादा हल कर सकते हैं:।

page.errorMessage.getText().then(function (text) { 
    expect(["Unknown Error", "Connection Error"]).toContain(text); 
}); 

मुझे यकीन नहीं है कि यह सबसे अच्छा विकल्प है या नहीं। मैं jasmine-matchers जैसे तृतीय पक्षों के आधार पर समाधान के साथ भी ठीक रहूंगा।


उदाहरण के लिए, जोर इस तरह का अजगर में मौजूद है:

self.assertIn(1, [1, 2, 3, 4]) 
+0

'चाई-ए-वादा किया गया' –

+0

@ बेंजामिनग्रेनबाम का उपयोग करें यदि आप एक उदाहरण के साथ एक उत्तर में सुझाव का विस्तार कर सकते हैं - यह बहुत अच्छा होगा, क्योंकि यह कस्टम मैचर के लिए एक वैध वैध विकल्प विकल्प की तरह लगता है। धन्यवाद! – alecxe

+0

आम तौर पर मुझे पुस्तकालयों को प्रश्नों के उत्तर के रूप में पेश करना पसंद नहीं है क्योंकि इससे लाइब्रेरी-सिफारिशें प्रश्न पूछती हैं - मैंने कहा कि मुझे लगता है कि वास्तव में यह शायद इस मामले में सबसे अच्छा विकल्प है। –

उत्तर

12

ऐसा लगता है कि आप एक कस्टम मिलान की जरूरत है। जैस्मीन के संस्करण के आधार पर प्रयोग कर रहे हैं:

जैस्मीन 1 के साथ:

this.addMatchers({ 
    toBeIn: function(expected) { 
     var possibilities = Array.isArray(expected) ? expected : [expected]; 
     return possibilities.indexOf(this.actual) > -1; 
    } 
}); 


जैस्मीन 2 के साथ:

this.addMatchers({ 
    toBeIn: function(util, customEqualityTesters) { 
     return { 
      compare: function(actual, expected) { 
       var possibilities = Array.isArray(expected) ? expected : [expected]; 
       var passed = possibilities.indexOf(actual) > -1; 

       return { 
        pass: passed, 
        message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual 
       }; 
      } 
     }; 
    } 
}); 


आप में इस पर अमल करना होगा आपके describe ब्लॉक पर beforeEach अनुभाग में इसका उपयोग किया जा रहा है।

आपका कैसा दिखेगा उम्मीद:

expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]); 
5

वैकल्पिक समाधान Regular Expressions साथ .toMatch() मिलान का उपयोग करें और के लिए है विशेष रूप से विशेष वर्ण | (बुलाया "या") है, जो करने के लिए केवल एक ही प्रविष्टि से मेल करने की अनुमति देता सफल होने:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/); 
3
मेरे लिए

, काम के आसपास है कि आप मुझे पहचान सबसे अच्छा समाधान है। हालांकि, हमें यह नहीं भूलना चाहिए कि यह असीमित निष्पादन है और आप Jasmine's asynchronous support पर विचार करना चाहेंगे।

फिर, अपने परीक्षण के बाद एक तरह दिखेगा:

it('should check item is in array', function(done){ //Note the argument for callback 

    // do your stuff/prerequisites for the spec here 

    page.errorMessage.getText().then(function (text) { 
     expect(["Unknown Error", "Connection Error"]).toContain(text); 
     done(); // Spec is done! 
    }); 
}); 

नोट: आप spec callback को यह done तर्क पारित नहीं करते, तो यह विफलताओं के बिना पूरा होने से चलाने के लिए जा रहा है, लेकिन उस spec के निष्पादन परिणामों में कोई दावा नहीं किया जा रहा है (दूसरे शब्दों में, उस स्पेक में 0 दावे होंगे) और इससे भ्रम पैदा हो सकता है।