जावास्क्रिप्ट में "मुखर" क्या है?


263

assertजावास्क्रिप्ट में क्या मतलब है?

मैंने कुछ ऐसा देखा है:

assert(function1() && function2() && function3(), "some text");

और जानना चाहेंगे कि विधि क्या करती assert()है।

जवाबों:


367

assertजावास्क्रिप्ट में कोई नहीं है (फिर भी , इसमें एक जोड़ने की बात है , लेकिन यह एक प्रारंभिक चरण में है)। शायद आप कुछ पुस्तकालय का उपयोग कर रहे हैं जो एक प्रदान करता है। सामान्य अर्थ त्रुटि को फेंकना है यदि फ़ंक्शन में पारित अभिव्यक्ति झूठी है; यह मुखर जाँच की सामान्य अवधारणा का हिस्सा है । आमतौर पर दावे (जैसा कि उन्हें कहा जाता है) का उपयोग केवल "परीक्षण" या "डिबग" में किया जाता है, निर्माण कोड से बाहर निकलता है और छीन लिया जाता है।

मान लीजिए कि आपके पास एक फ़ंक्शन था जिसे हमेशा एक स्ट्रिंग को स्वीकार करना चाहिए था । आप जानना चाहते हैं कि क्या किसी ने उस फ़ंक्शन को उस चीज के साथ बुलाया जो स्ट्रिंग नहीं था। तो आप ऐसा कर सकते हैं:

assert(typeof argumentName === "string");

... assertअगर हालत झूठी थी तो एक त्रुटि कहाँ फेंक देंगे।

एक बहुत ही सरल संस्करण इस तरह दिखेगा:

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}

Errorयदि जावास्क्रिप्ट इंजन इसका समर्थन करता है (वास्तव में पुराने नहीं हो सकता है), जिसका स्टैक ट्रेस एकत्रित करने का लाभ होता है और जैसे: वस्तु का बेहतर उपयोग करना

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}

यहां तक ​​कि IE8 में Error(हालांकि इसके पास stackसंपत्ति नहीं है , लेकिन आधुनिक इंजन [आधुनिक IE सहित] करते हैं)।


6
... जेएस में प्रकार के बारे में अपरिपक्वता हो रही है? मेरा तर्क है कि इसके सबसे बुरे कारणों में से एक है assert
cHao

137
@ कोको: मान्य उपयोग के मामले हैं। यह केवल पहला उदाहरण था जो दिमाग में आया था। उदाहरण की बात नहीं है। अभिकथन की अवधारणा बिंदु है।
TJ क्राउडर

4
कुछ है जो मैंने अपने कोड में जोड़ा है, उसके बाद if(!condition)सेटिंग है, var throwError=true;फिर debugger;एक में फेंक अनुभाग लपेटें if(throwError)। इस तरह, अगर मेरे पास डिबगर खुला है, तो यह टूट जाएगा, और अगर मेरी इच्छा है तो मैं throwErrorझूठ बोल सकता हूं और फिर बाहर निकलते समय सभी स्कोप की जांच कर सकता हूं ।
रिक

8
@ क्लिक करें यदि आप क्रोम देवटूल का उपयोग करते हैं, तो आप केवल स्रोत टैब में "अनकांशेड एक्सेप्शन पर रोकें" को सक्षम कर सकते हैं और यह स्वतः ही टूट जाएगा throw। इस तरह आपको debugger;कथन की आवश्यकता नहीं है । अधिक के लिए developer.chrome.com/devtools/docs/… देखें ।
विक्की चिजवानी

1
@machineghost: मैं यह नहीं देखता कि यह कैसे "सरल" है, आपने सिर्फ ifएक सशर्त ऑपरेटर के लिए कारोबार किया है। वैसे भी, आज की दुनिया में, मैं उन इंजनों का समर्थन करने की जहमत नहीं उठाऊंगा जो नहीं हैं Error
टीजे क्राउडर

157

यदि एक आधुनिक ब्राउज़र या नोडज का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं console.assert(expression, object)

अधिक जानकारी के लिए:


46
FYI करें, यह अधिक कार्य करता है जैसे console.errorकि कोड निष्पादित करना जारी रखता है।
डैनियल सोकोलोव्स्की

10
@DanielSokolowski, बिल्कुल। console.assertयह तब तक अच्छा नहीं है जब तक कि इसके समान व्यवहार न हो throw
पचेरियर

23
कारण निष्पादित होने के बाद console.assertभी जारी है क्योंकि दावे त्रुटि से निपटने के कार्य नहीं हैं। वे केवल विकास के दौरान कोड शुद्धता की जाँच के लिए डिज़ाइन किए गए हैं। परंपरागत रूप से वे उत्पादन वातावरण में पूरी तरह से अक्षम हो जाते हैं ताकि कुछ तुच्छ होने के कारण लाइव सिस्टम समाप्त न हो। ब्राउज़र को उत्पादन वातावरण माना जाता है, इसलिए console.assertवहां निष्पादन समाप्त नहीं करता है। यदि आप निष्पादन को रोकने के लिए दावे पर भरोसा कर रहे हैं, तो आपको इसके बजाय उचित त्रुटि हैंडलिंग का उपयोग करना चाहिए, क्योंकि यह वह नहीं है जिसके लिए दावे किए जाते हैं।
मालवीयस

8
@ रॉनबर्क: भाषा डिजाइनरों ने फैसला किया कि "किस दावे के लिए हैं"। में सी ++ [एक अभिकथन] कब्जा प्रोग्रामिंग त्रुटियों, नहीं उपयोगकर्ता या चलाने के समय त्रुटियों के लिए डिज़ाइन किया गया है, क्योंकि यह आम तौर पर के बाद एक कार्यक्रम अपने डिबगिंग चरण बाहर निकालता अक्षम है। PHP का कहना है कि यदि नियम जाँच सक्रिय नहीं है, तो अंगूठे के नियम के रूप में आपके कोड को हमेशा सही ढंग से काम करने में सक्षम होना चाहिए। निष्क्रिय आवाज़ का अर्थ किसी व्यक्तिगत प्राथमिकता को अधिकार देना नहीं था, बल्कि यह रिपोर्ट करना था कि व्यापक रूप से स्वीकृत सामान्य प्रथा क्या है।
माल्वेनियस

4
@ डॉन: पॉइंट लिया गया लेकिन मैं लिंक किए गए पेजों से उद्धृत कर रहा था। मेरा मानना ​​है कि अभिकर्मकों के साथ ऐसा व्यवहार किया जाना चाहिए जैसे कि उन्हें अक्षम किया जा सकता है, यदि केवल इसलिए कि आपका कोड एक दिन किसी ऐसे व्यक्ति द्वारा उपयोग किया जा सकता है जो ऐसा सोचता है कि ऐसा करना सुरक्षित है। यदि आपके कोड में दावे महत्वपूर्ण हैं, तो मुझे लगता है कि उन्हें वास्तव में डिबगिंग पद्धति पर भरोसा करने के बजाय उचित त्रुटि जाँच के लिए अपग्रेड किया जाना चाहिए जो हमेशा निष्पादन को समाप्त करने की गारंटी नहीं है। यह उल्लेख नहीं करने के लिए कि आपका कोड बार-बार उत्पादन वातावरण में मर जाता है जब यह सिर्फ एक त्रुटि लौटा सकता है और जारी रख सकता है और इसके लायक होने से अधिक तनाव हो सकता है!
माल्विनस

29

अन्य उत्तर अच्छे हैं: ECMAScript5 (जैसे जावास्क्रिप्ट जो मूल रूप से हर जगह काम करता है) में निर्मित एक मुखर फ़ंक्शन नहीं है, लेकिन कुछ ब्राउज़र इसे आपको देते हैं या इसमें ऐड-ऑन होते हैं जो कि कार्यक्षमता प्रदान करते हैं। हालांकि शैक्षणिक उद्देश्यों के लिए एक "गरीब आदमी के जोर" समारोह के लिए यह एक अच्छी तरह से स्थापित / लोकप्रिय / बनाए रखा पुस्तकालय का उपयोग करना सबसे अच्छा है, कुछ इस तरह दिख सकता है:

const assert = function(condition, message) {
    if (!condition)
        throw Error('Assert failed: ' + (message || ''));
};

assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in console


BTW, कोई भी इसे आसानी से संशोधित कर सकता है ताकि यह केवल विकास के वातावरण में एक त्रुटि फेंके (जैसे किसी अन्य में लपेटकर / यदि एक और सशर्त जोड़कर) और अन्यथा कुछ भी नहीं करता है या केवल चेतावनी देता है। व्यक्तिगत रूप से, मेरी राय यह है कि अभिकथन केवल टेस्ट कोड में होना चाहिए (उदाहरण के लिए जाँचना कि अपेक्षित और वास्तविक परिणाम मेल खाते हैं); उत्पादन कोड में वे या तो किया जा ज़रूरत से ज़्यादा (डिजाइन द्वारा सही गारंटी) चाहिए और इस तरह से हटाया या केवल उपयोगकर्ता / बाहरी इनपुट जो मामले में वे तर्क और मानक अपवाद संचालन (जैसे प्रतिबंध लगाया द्वारा बदला जा सकता है की रखवाली के लिए try, catch, throw)
iX3

8

assert()एक देशी जावास्क्रिप्ट फ़ंक्शन नहीं है। यह एक कस्टम फंक्शन है जिसे किसी ने बनाया है। आपको इसे अपने पेज पर या अपनी फ़ाइलों में देखना होगा और किसी को भी यह निर्धारित करने में मदद करने के लिए पोस्ट करना होगा कि यह क्या कर रहा है।


5

इसे देखो: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

यह जावास्क्रिप्ट का परीक्षण करने के लिए है। आश्चर्यजनक रूप से, मुश्किल से पाँच या छः पंक्तियों में, यह कोड परीक्षण करते समय आपके कोड पर बहुत अधिक शक्ति और नियंत्रण प्रदान करता है।

मुखर फ़ंक्शन दो मापदंडों को स्वीकार करता है:

परिणाम: एक बूलियन, जो संदर्भ देता है कि आपका परीक्षण पास हुआ या असफल

विवरण: आपके परीक्षण का संक्षिप्त विवरण।

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


4

यहाँ एक मुखर फ़ंक्शन का वास्तव में सरल कार्यान्वयन है। यह एक मूल्य और जो आप परीक्षण कर रहे हैं उसका विवरण लेता है।

 function assert(value, description) {
        var result = value ? "pass" : "fail";
        console.log(result + ' - ' +  description); 
    };

यदि मान सत्य का मूल्यांकन करता है तो यह गुजरता है।

assert (1===1, 'testing if 1=1');  

यदि यह गलत है तो यह विफल हो जाता है।

assert (1===2, 'testing if 1=1');

1
मुखरता का उद्देश्य सूचना स्तर पर गतिरोध के लिए लॉग इन नहीं करना है, लेकिन प्रोग्राम निष्पादन (आमतौर पर एक अपवाद को उठाना) को रोकना और यदि झूठे पर मूल्यांकन किया जाता है, तो stderr पर लॉग इन करना।
नूनो एंड्रे

4

यदि दावा गलत है, तो संदेश प्रदर्शित होता है। विशेष रूप से, यदि पहला तर्क गलत है, तो दूसरा तर्क (स्ट्रिंग संदेश) डेवलपर टूल कंसोल में लॉग इन किया जाएगा। यदि पहला तर्क सत्य है, तो मूल रूप से कुछ भी नहीं होता है। एक सरल उदाहरण - मैं Google डेवलपर टूल का उपयोग कर रहा हूं:

var isTrue = true;
var isFalse = false;
console.assert(isTrue, 'Equals true so will NOT log to the console.');
console.assert(isFalse, 'Equals false so WILL log to the console.');

3

यह शायद एक परीक्षण पुस्तकालय के साथ आया था जो आपके कुछ कोड का उपयोग कर रहा है। यहां एक उदाहरण दिया गया है (संभावना है कि यह वही लाइब्रेरी नहीं है जैसा आपका कोड उपयोग कर रहा है, लेकिन यह सामान्य विचार दिखाता है):

http://chaijs.com/guide/styles/#assert


2

शब्द या फ़ंक्शन "मुखर" का उपयोग ज्यादातर आवेदन के कुछ हिस्सों के परीक्षण में किया जाता है।

Assert फ़ंक्शन स्थिति की जांच करने के लिए प्रोग्राम को निर्देश देने का एक छोटा तरीका है (जिसे "अभिकथन" भी कहा जाता है) और यदि स्थिति सही नहीं है, तो यह त्रुटि फेंक देगा।

तो आइए देखें कि यह "सामान्य कोड" में कैसा दिखेगा

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

साथ assertआप बस लिख सकते हैं:

assert(typeof "string" === "array")

जावास्क्रिप्ट में, कोई मूल नहीं है assert कार्य , इसलिए आपको कुछ लाइब्रेरी से एक का उपयोग करना होगा।

सरल परिचय के लिए, आप इस लेख को देख सकते हैं:

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

मुझे उम्मीद है यह मदद करेगा।


2

यदि पहला गुण गलत है, और दूसरा गुण फेंक दिया जाने वाला संदेश है, तो जोर त्रुटि संदेश देता है।

console.assert(condition,message);

कई टिप्पणियां कहती हैं कि अभिकथन जावास्क्रिप्ट में मौजूद नहीं है, लेकिन जावास्क्रिप्ट console.assert()में मुखर कार्य होता है अभिकथन का विचार यह है कि बग क्यों / जहां पाया जाता है।

console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");

यहां संदेश के आधार पर आप पा सकते हैं कि बग क्या है। इन त्रुटि संदेशों को लाल रंग में सांत्वना देने के लिए प्रदर्शित किया जाएगा जैसे कि हमने console.error();
सांत्वना निष्पादन में अधिक कार्य देखने के लिए कहा थाconsole.log(console);


1

पिछले उत्तर प्रदर्शन और संगतता के संदर्भ में सुधारा जा सकता है।

यदि वस्तु मौजूद है तो एक बार जाँच करें Error, अगर यह घोषित नहीं किया गया है:

if (typeof Error === "undefined") {
    Error = function(message) {
        this.message = message;
    };
    Error.prototype.message = "";
}

फिर, प्रत्येक जोर स्थिति की जांच करेगा, और हमेशा एक Errorवस्तु फेंक देगा

function assert(condition, message) {
    if (!condition) throw new Error(message || "Assertion failed");
}

ध्यान रखें कि कंसोल वास्तविक त्रुटि रेखा संख्या प्रदर्शित नहीं करेगा, लेकिन assertफ़ंक्शन की रेखा , जो डीबगिंग के लिए उपयोगी नहीं है।


1

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

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

आपको इसका उपयोग करने में सक्षम होने के लिए वेबपैक या ब्राउज़राइज़ का उपयोग करने की आवश्यकता है, तो जाहिर है कि यह केवल तभी उपयोगी है जब वे आपके वर्कफ़्लो में पहले से मौजूद हों।


1

कंसोल.स्सर्ट या अपने खुद के रोल करने जैसे अन्य विकल्पों के अलावा , आप इनवेरिएंट का उपयोग कर सकते हैं । इसमें कुछ विशिष्ट विशेषताएं हैं:

  • यह स्वरूपित त्रुटि संदेशों (एक %sविशेष का उपयोग करके ) का समर्थन करता है ।
  • उत्पादन वातावरण में (Node.js या वेबपैक वातावरण द्वारा निर्धारित), त्रुटि संदेश वैकल्पिक है, (थोड़ा) .js के लिए अनुमति देता है।

0

जैसा कि TJ द्वारा बताया गया है, assertजावास्क्रिप्ट में कोई भी नहीं है। हालांकि, एक नोड मॉड्यूल है जिसका नाम मुखर है , जिसका उपयोग ज्यादातर परीक्षण के लिए किया जाता है । तो, आप कोड देख सकते हैं जैसे:

const assert = require('assert');
assert(5 > 7);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.