2014-07-03 7 views
15

मेरे परीक्षण में मैं प्रोटैक्टर का उपयोग करके कुछ UI परीक्षणों को चलाने से पहले हमारे बैकएंड में बीज डेटा को बीजिंग और बाहर भेज रहा हूं।प्रोटैक्टर का उपयोग करके प्रवाह नियंत्रण कतार में आप कैसे वादा करते हैं?

'use strict' 

var dataBuilder = require('data_builder.js'); 

describe('test', function() { 
    var testData = { 
    name: 'foo', 
    title: 'bar', 
    ... 
    }; 

    beforeEach(function() { 
    //create test data on the backend 
    dataBuilder.create(testData).then(function (id) { 
     testData.id = id.id; 
    }); 
    }); 



    it('test something', function() { 
    ... 
    }); 

के रूप में इस तरह के वादे dataBuilder द्वारा दिया यह पहले हल नहीं होती है() वास्तव में खत्म। मैं डेटा बिल्डर द्वारा वेबड्राइवर के प्रवाह नियंत्रण में वापस किए गए वादे को कैसे जोड़ सकता हूं?

उत्तर

15

प्रोटैक्टर प्रोट्रैक्टर ऑब्जेक्ट पर WebDriverJS वादे का खुलासा करता है ताकि आप या तो flow.await विधि का उपयोग कर सकें या नया वादा तैयार कर सकें और flow.execute का उपयोग कर सकें।

कुछ

पूर्व प्राप्त किया जा सकता है जैसे:

flow = protractor.promise.controlFlow() 

flow.await(dataBuilder.create(testData)).then(function(id) { 
    testData.id = id.id; 
}) 

और आप इस blog post में बाद का एक उदाहरण देख सकते हैं।

यह it फ़ंक्शन में ही किया जा सकता है या यदि यह आपके सभी परीक्षणों के लिए आम है तो इसे अपने प्रोटैक्टर कॉन्फ़िगरेशन के onPrepare फ़ंक्शन में रखने पर विचार करें।

+2

मैंने इस दृष्टिकोण का उपयोग किया, सिवाय इसके कि मैंने 'browser.controlFlow()। Await (...)' shorthand का उपयोग किया जो प्रोटैक्टर अब समर्थन करता है, बहुत अच्छा काम करता है! –

12

मेरे प्रोटैक्टर परीक्षण में मैं निम्नलिखित पैटर्न का उपयोग करके वेब ड्रायवर के प्रवाह नियंत्रण में कुछ जोड़ता हूं। यदि कोई इन "विभिन्न वक्तव्यों" से वादा करता है और देता है, तो वादा नियंत्रण प्रवाह में सही ढंग से डाला जाएगा।

browser.controlFlow().execute(function() { 
    // various statements 
}); 
+1

अच्छा जवाब, लेकिन आपको यह स्पष्ट करना चाहिए कि कोई इन "विभिन्न कथन" से एक वादा बना और वापस कर सकता है जिसे नियंत्रण प्रवाह में सही ढंग से डाला जाएगा – floribon

2

इस विशिष्ट मामले में, आप beforeEach इस तरह में done कॉलबैक इस्तेमाल कर सकते हैं:

beforeEach(function (done) { 
    dataBuilder 
     .create(testData) 
     .then(function (id) { 
     testData.id = id.id; 
     }) 
     .finally(done); 
}); 

स्वीकारना एक done कॉलबैक पैरामीटर इंगित करता है कि सेटअप अतुल्यकालिक है।

0

मैं वाक्य रचना याद कभी नहीं, इसलिए मैं प्रकार के बाद से यह रास्ता वादा बर्ताव करता है पर निर्भर करता है (ताकि मूल रूप से आप हर वादा आधारित प्रणाली में इसका उपयोग कर सकते)

browser.sleep(1).then(()=> { 
    return someAsyncPromiseAction(); 
}) 

याद करने के लिए आसान है इस बात का एक hack का उपयोग एक और चीज जो आप कर सकते हैं वह बस इससे पहले की कार्रवाई पर निर्भर है। तो अगर आप, उदाहरण के लिए, बस एक बटन क्लिक किया कि यह इस

$(' ... ').click().then(() => { return someAsync(); }) 

तरह दिखेगा जबकि इस प्रवाह नियंत्रण के लिए एक वादा नहीं जोड़ता है, आप अभी भी एक ही परिणाम मिलता है।

संबंधित मुद्दे