2009-06-02 17 views
14

पास करता है मैं जावास्क्रिप्ट इकाई परीक्षण के लिए QUnit में देख रहा हूं। मैं एक अजीब परिस्थिति में हूं जहां मैं अजाक्स कॉल से लौटाए गए मूल्य के खिलाफ जांच कर रहा हूं।अजाक्स के साथ QUNit, QUNit असफल परीक्षण

निम्नलिखित परीक्षण के लिए मैं जानबूझकर इसे विफल करने की कोशिश कर रहा हूं।

// test to check if the persons are returned! 
test("getPersons", function() { 
    getPersons(function(response) { 
    // persons = $.evalJSON(response.d); 
    equals("boo", "Foo", "The name is valid"); 
    }); 
}); 

लेकिन यह हर समय गुजरता है। यहां GetPersons विधि है जो अजाक्स कॉल बनाती है।

function getPersons(callback) { 
    var persons = null; 

    $.ajax({ 
    type: "POST", 
    dataType: "json", 
    data: {}, 
    contentType: "application/json", 
    url: "AjaxService.asmx/GetPersons", 
    success: function(response) { 
     callback(response); 
    } 
    }); 
} 
+0

मैं आपको "उम्मीद" संख्या ('QUnit.test' के लिए दूसरा तर्क) भरने की सलाह दूंगा ताकि समय पर सबकुछ कहने पर आसानी से पकड़ना आसान हो। अन्यथा यह हो सकता है कि अगर सभी दावों को भेजने से पहले 'स्टार्ट' बहुत जल्दी बुलाया जाता है तो 0 गुना हो सकता है। – Krinkle

उत्तर

25

क्विनीट लाइब्रेरी का उपयोग शुरू करना और रोकना काम करना प्रतीत होता है!) फिर से आपको लगता है कि दृष्टिकोण का उपयोग कर मुसीबत में पड़ सकता है अगर आप स्टॉप (बुला में सावधान नहीं हो वास्तव में -

// test to check if the persons are returned! 
test("getPersons", function() { 
    stop(); 
    getPersons(function(response) { 
    persons = $.evalJSON(response.d); 
    equals(persons[0].FirstName, "Mohammad"); 
    start(); 
    }); 
}); 
+1

के रूप में परीक्षण समाप्त हो गया था क्योंकि @ गोयिक्स ने कहा था कि आप 'स्टॉप() 'को कॉल करने से बचने के लिए' test()' के बजाय 'asyncTest()' का उपयोग भी कर सकते हैं। कार्य करें और यह स्पष्ट करें कि यह एक एसिंक परीक्षण है। –

2

ive ने AJAX के साथ कुछ qunit परीक्षण किया। यह सुंदर नहीं है। सबसे अच्छी चीज जो मैं आ सकता हूं, परीक्षण को रोक रहा है जब AJAX निकाल दिया जाता है, और सफलता कॉलबैक में इसे फिर से शुरू किया जाता है। (स्टार्ट() और स्टॉप()) विधियों का उपयोग कर। इसका मतलब एक समय में एक AJAX अनुरोध था, लेकिन मैं इसके साथ रह सकता था। शुभकामनाएं

+0

प्रारंभ करना और रोकना काम प्रतीत होता है! समाधान नीचे दिए गए पद में पोस्ट किया गया है। धन्यवाद! – azamsharp

+0

लेकिन मुझे आश्चर्य है कि मेरा उपरोक्त दृष्टिकोण क्यों काम नहीं कर रहा था। मैं प्रतिक्रिया और सबकुछ तक पहुंच सकता था। ऐसा लगता है कि बराबर असफल रहा था! – azamsharp

+2

मुझे लगता है कि AJAX की एसिंक प्रकृति की वजह से, प्रतिक्रिया वापस आने से पहले – mkoryak

13

वास्तविक समस्या यहाँ) शुरू (फोन और (रोक) तरीकों की जरूरत नहीं है यदि आपके पास अतिरिक्त .ajax() विधियां हैं तो आपके कॉलबैक का अंत। जिसका अर्थ यह है कि यदि आप अभी भी स्टॉप() को फिर से कॉल करने की आवश्यकता है तो सभी कॉलबैक को यह जानने के लिए निकाल दिया गया है कि आप ट्रैक रखने के लिए कुछ झुका हुआ गड़बड़ में खुद को पाते हैं।

समस्या के मूल अतुल्यकालिक अनुरोध के डिफ़ॉल्ट व्यवहार शामिल है - और सरल उपाय async गलत पर संपत्ति की स्थापना द्वारा .ajax() अनुरोध तुल्यकालिक ऐसा करने के लिए है:

test("synchronous test", function() { 
    $.ajax({ 
    url:'Sample.asmx/Service', 
    async:false, 
    success: function(d,s,x) { ok(true, "Called synchronously"); } 
    }); 
}); 

भी फिर भी, सबसे अच्छा तरीका एसिंक्रोनस व्यवहार की अनुमति देना और सही परीक्षण विधि का उपयोग करना है: asyncTest()। डॉक्स के अनुसार, "अतुल्यकालिक परीक्षण पंक्तिबद्ध कर रहे हैं और एक के बाद एक चलाते हैं।) एक सामान्य परीक्षण (बुला के बराबर और तुरंत बुला बंद()।"

asyncTest("a test", function() { 
    $.ajax({ 
    url: 'Sample.asmx/Service', 
    success: function(d,s,x) { 
     ok(true, "asynchronous PASS!"); 
     start(); 
    } 
    }); 
}); 
+0

asyncTest (नाम, ...) परीक्षण के लिए एक सुविधाजनक तरीका है (नाम, फ़ंक्शन() {stop(); ...})। घोंसला = बुरा विचार। –

+0

@ जोर्न - घोंसले को इंगित करने के लिए धन्यवाद। इस जवाब पर वापस पढ़ना मुझे यकीन नहीं है कि मैंने इसे पहले स्थान पर क्यों लपेट लिया है, शायद यह स्पष्ट करने के अलावा कि आप कर सकते हैं। मैंने इसे और स्पष्ट करने के लिए asyncTest विधि को अनचाहे कर दिया है कि इसका उपयोग कैसे किया जाना है। – Goyuix

3

वहाँ अपने प्रोजेक्ट में qunit परीक्षण का एक बहुत । जैसे:

module("comment"); 
    asyncTest("comment1", function() { 
     expect(6); 
     $.ajax({ 
     url: 'http://xxx.com/comment', 
     dataType: "json", 
     type: "GET", 
     timeout: 1000 
     }).done(function(data) { 
     ok(true, "loaded"); 
     ok(data.data.length>1, "array size"); 
     ok(data.total, "attr total"); 
     var c = data.data[0]; 
     ok(c.id, "attr c.id"); 
     ok(c.user_id, "attr c.user_id"); 
     ok(c.type == 4, "attr c.type equal 4"); 
     }).fail(function(x, text, thrown) { 
     ok(false, "ajax failed: " + text); 
     }).always(function(){ 
     start(); 
     }); 
    }); 
संबंधित मुद्दे