2014-12-30 5 views
10

मैं अनुरोध वापसी में त्रुटि का परीक्षण करना चाहता हूं। मैं अपने परीक्षणों में नॉक का उपयोग कर रहा हूं, मैं नॉक को एक त्रुटि को उत्तेजित करने के लिए कैसे मजबूर कर सकता हूं? मैं 100% परीक्षण कवरेज प्राप्त करना चाहता हूं और उसनॉक के अनुरोध में त्रुटि का परीक्षण कैसे करें?

request('/foo', function(err, res) { 
    if(err) console.log('boom!'); 
}); 

त्रुटियों की शाखा में प्रवेश न करें। यहां तक ​​कि अगर हिट अं एक वैध प्रतिक्रिया है, परीक्षा में मेरी काटने का निशान लगाना लाइन की तरह इस

nock('http://localhost:3000').get('/foo').reply(400); 

संपादित दिखता है: कुछ टिप्पणियों के लिए धन्यवाद:

  • मैं में एक त्रुटि उपहास करने के लिए कोशिश कर रहा हूँ निवेदन। नोड मैनुअल से: https://nodejs.org/api/http.html#http_http_request_options_callback अनुरोध के दौरान किसी भी त्रुटि का सामना किया है (हो सकता है कि DNS संकल्प, टीसीपी स्तर त्रुटियों, या वास्तविक HTTP पार्स त्रुटि के साथ) एक 'त्रुटि' घटना लौटे अनुरोध वस्तु
  • एक पर उत्सर्जित होता है त्रुटि कोड (उदाहरण के लिए 4xx) त्रुटि चर परिभाषित नहीं करता है। मैं बिल्कुल कि उपहास करने के लिए, जो कुछ भी त्रुटि है कि गलती चर को परिभाषित करता है और सच
+0

क्या आप अभी बुरा अनुरोध नहीं कर सकते? उदाहरण के लिए यूआरएल को '' '' या 'अपरिभाषित' में सेट करना। – agconti

+0

@agconti नॉक के साथ आप सर्वर प्रतिक्रिया का मज़ाक उड़ाते हैं, मैं एक HTTP त्रुटि को मजबूर करने की कोशिश कर रहा हूं। नोड मैनुअल (http://nodejs.org/api/http.html#http_http_request_options_callback) _ अगर अनुरोध के दौरान कोई त्रुटि आई है (चाहे वह DNS रिज़ॉल्यूशन, टीसीपी स्तर त्रुटियों, या वास्तविक HTTP पार्स त्रुटियों के साथ हो) त्रुटि 'घटना लौटाई गई अनुरोध वस्तु पर उत्सर्जित होती है ._ – coolxeo

+0

यह व्यवहार नकली-अप के लिए अप्रासंगिक है। क्या आपने इसे HTTP त्रुटि संदेश के साथ जवाब देने का प्रयास किया है? –

उत्तर

0

ऐसा लगता है आप एक काटने का निशान के अनुरोध पर एक अपवाद के लिए देख रहे हैं की तरह का मूल्यांकन कोशिश कर रहा हूँ, इस हो सकता है आप मदद कर सकते हैं:

var nock = require('nock'); 
var google = nock('http://google.com') 
       .get('/') 
       .reply(200, 'Hello from Google!'); 

try{ 
    google.done(); 
} 
catch (e) { 
    console.log('boom! -> ' + e); // pass exception object to error handler 
} 
+0

धन्यवाद, मैं 100% परीक्षण कवरेज प्राप्त करने की कोशिश कर रहा हूं, लेकिन मुझे आग लगने का एक तरीका चाहिए (उत्तेजित) वह त्रुटि, समस्या नॉक केवल विफल होती है अगर उनके पास उस यूआरएल – coolxeo

5

जब आप request(url, callback) के साथ http (ओं) अनुरोध प्रारंभ करते हैं, तो यह एक ईवेंट एमिटर इंस्टेंस (कुछ कस्टम गुणों/विधियों के साथ) देता है।

जब तक आप इस वस्तु पर अपने हाथों को प्राप्त कर सकते हैं (यह कुछ पुनर्रचना की आवश्यकता हो सकती या शायद यह भी आप के लिए उपयुक्त नहीं हो सकता है) आप एक error घटना फेंकना है, इस प्रकार के साथ err किया जा रहा है अपने कॉलबैक फायरिंग इस emitter कर सकते हैं आपके द्वारा उत्सर्जित त्रुटि।

निम्नलिखित कोड स्निपेट इसे प्रदर्शित करता है।

'use strict'; 

// Just importing the module 
var request = require('request') 
// google is now an event emitter that we can emit from! 
    , google = request('http://google.com', function (err, res) { 
     console.log(err) // Guess what this will be...? 
    }) 

// In the next tick, make the emitter emit an error event 
// which will trigger the above callback with err being 
// our Error object. 
process.nextTick(function() { 
    google.emit('error', new Error('test')) 
}) 

संपादित

इस दृष्टिकोण के साथ समस्या यह है कि, ज्यादातर स्थितियों में, पुनर्रचना का एक सा की आवश्यकता है। एक वैकल्पिक दृष्टिकोण इस तथ्य का फायदा उठाता है कि नोड के मूल मॉड्यूल पूरे आवेदन में कैश किए जाते हैं और फिर से उपयोग किए जाते हैं, इस प्रकार हम http मॉड्यूल और संशोधित कर सकते हैं हमारे संशोधनों को देखेंगे। यह चाल http.request() विधि बंदर-पैचिंग में है और इसमें तर्क का अपना थोड़ा सा इंजेक्शन है।

निम्नलिखित कोड स्निपेट इसे प्रदर्शित करता है।

'use strict'; 

// Just importing the module 
var request = require('request') 
    , http = require('http') 
    , httpRequest = http.request 

// Monkey-patch the http.request method with 
// our implementation 
http.request = function (opts, cb) { 
    console.log('ping'); 
    // Call the original implementation of http.request() 
    var req = httpRequest(opts, cb) 

    // In next tick, simulate an error in the http module 
    process.nextTick(function() { 
    req.emit('error', new Error('you shall not pass!')) 
    // Prevent Request from waiting for 
    // this request to finish 
    req.removeAllListeners('response') 
    // Properly close the current request 
    req.end() 
    }) 

    // We must return this value to keep it 
    // consistent with original implementation 
    return req 
} 

request('http://google.com', function (err) { 
    console.log(err) // Guess what this will be...? 
}) 

मुझे लगता है कि काटने का निशान लगाना कुछ इसी तरह (http मॉड्यूल पर तरीकों की जगह) करता है तो मैं सुझाव है कि आप आप की आवश्यकता के बाद इस बंदर-पैच लागू (और शायद यह भी कॉन्फ़िगर किया गया?) नॉक

ध्यान दें कि यह अपने कार्य को सुनिश्चित करें कि आप केवल जब सही URL अनुरोध किया जाता है (opts वस्तु निरीक्षण) और मूल http.request() कार्यान्वयन ताकि भविष्य परीक्षण अपने परिवर्तनों से प्रभावित नहीं हैं बहाल करने के लिए त्रुटि फेंकना बनाने के लिए किया जाएगा।

+0

के लिए मैपिंग नहीं है तो बहुत स्मार्ट कार्यान्वयन @RobertRossman। मेरे पास एकमात्र समस्या है कि इसे पुन: सक्रिय करना आसान नहीं है। कई अनुरोध हैं और मुझे उन सभी का परीक्षण करने की आवश्यकता है। परीक्षण से इस उत्सर्जन के उदाहरणों तक पहुंचना मुश्किल है। ऐसा इसलिए है क्योंकि मैं नॉक का उपयोग कर रहा हूं, जो http ur अनुरोधों को मेल करता है जो कुछ यूआरएल – coolxeo

+0

से मेल खाते हैं, मुझे यकीन नहीं है कि क्या आप और भी कर सकते हैं ... एक और विकल्प है जो मेरे सिर में बस आया - मैं इसे अपडेट करूंगा एक पल में जवाब। –

+0

अपडेट किया गया - कृपया ** EDIT ** भाग देखें। –

18

उत्तर का उपयोग करें WithError। डॉक्स से:

nock('http://www.google.com') 
    .get('/cat-poems') 
    .replyWithError('something awful happened'); 
0

मैं देर से कुछ साल im जानते हैं, लेकिन इस बात के लिए देख रहा था और यह मिल जाए, शायद यह किसी के समय की बचत कर सके।

मैंने http://errorhost पर अनुरोध करके इसे हल किया या उन पंक्तियों में कुछ भी हो सकता है।

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