मोचा के साथ जावास्क्रिप्ट परीक्षण में assert.equal और assert.deepEqual के बीच अंतर?


91

मैं अपने Express.js एप्लिकेशन में एक छोटे मॉड्यूल का परीक्षण करने के लिए मोचा का उपयोग कर रहा हूं। इस मॉड्यूल में, मेरा एक कार्य एक सरणी देता है। मैं परीक्षण करना चाहता हूं कि दिए गए इनपुट के लिए सरणी सही है या नहीं। मैं इस तरह से कर रहा हूँ:

suite('getWords', function(){
    test("getWords should return list of numbers", function() {
        var result = ['555', '867', '5309'];
        assert.equal(result, getWords('555-867-5309'));
    });
});

जब यह चलता है, तो मुझे निम्नलिखित दावे की त्रुटि मिलती है:

AssertionError: ["555","867","5309"] == ["555","867","5309"]

हालाँकि, जब मैं अपना परीक्षण ए में बदलता हूं assert.deepEqual, तो परीक्षण ठीक गुजरता है। मैं सोच रहा था कि क्या यह ==बनाम का मामला है ===, लेकिन अगर मैं दर्ज करता हूं

[1,2,3] === [1,2,3]

नोड कमांड लाइन में, मैं अभी भी गलत हूं।

सरणियाँ अन्य मानों (जैसे 1 == 1) के तरीके की तुलना क्यों नहीं करती हैं ? और assert.equal और assert.deepEqual के बीच क्या अंतर है?

जवाबों:


158

अन्य मानों की तुलना में सरणियों की तुलना क्यों नहीं की जाती (उदाहरण 1 == 1)

संख्या, तार, बूलियन, nullऔर undefinedमान हैं, और तुलना की जाती है जैसा कि आप उम्मीद कर सकते हैं। 1 == 1, 'a' == 'a'और इतने पर। के बीच का अंतर ===और ==मूल्यों के मामले में वह यह है कि ==पहले प्रकार रूपांतरण करने के लिए है, जिसके कारण का प्रयास करेंगे '1' == 1लेकिन नहीं '1' === 1

दूसरी ओर, Arrays, वस्तुएं हैं। ===और ==इस मामले में यह संकेत नहीं देते हैं कि ऑपरेंड शब्दशः समान हैं, लेकिन वे एक ही वस्तु को संदर्भित करते हैं

assert.equal और assert.deepEqual में क्या अंतर है?

assert.equalजैसा कि ऊपर बताया गया है। यह वास्तव में विफल रहता है यदि तर्क हैं !=, जैसा कि आप स्रोत में देख सकते हैं । इस प्रकार यह संख्या के तार के आपके सरणियों के लिए विफल रहता है क्योंकि यद्यपि वे अनिवार्य रूप से समतुल्य हैं, वे समान वस्तु नहीं हैं।

दूसरी ओर दीप (उर्फ संरचनात्मक) समानता, यह परीक्षण नहीं करता है कि क्या ऑपरेंड एक ही वस्तु हैं, बल्कि यह कि वे समकक्ष हैं। एक मायने में, आप कह सकते हैं कि यह वस्तुओं को तुलना करने के लिए मजबूर करता है, हालांकि वे मूल्य हैं।

var a = [1,2,3]  
var b = a              // As a and b both refer to the same object
a == b                 // this is true
a === b                // and this is also true

a = [1,2,3]            // here a and b have equivalent contents, but do not
b = [1,2,3]            // refer to the same Array object.
a == b                 // Thus this is false.

assert.deepEqual(a, b) // However this passes, as while a and b are not the 
                       // same object, they are still arrays containing 1, 2, 3

assert.deepEqual(1, 1) // Also passes when given equal values

var X = function() {}
a = new X
b = new X
a == b                 // false, not the same object
assert.deepEqual(a, b) // pass, both are unadorned X objects
b.foo = 'bar'
assert.deepEqual(a, b) // fail!

4
की शानदार व्याख्या deepEqual(); तुलना में वास्तव में कुछ ऐसा नहीं है जिसके बारे में आप तब तक सोचते हैं जब तक आप वास्तव में इसके पार नहीं आते हैं।
ब्रांडनस्क्रिप्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.