चाई में मुखर, अपेक्षा और क्या अंतर है?


160

क्या assert, expectऔर should, और कब उपयोग करना है के बीच अंतर क्या है?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');

जवाबों:


289

मतभेद वहाँ प्रलेखित हैं

तीन इंटरफेस प्रदर्शन करने के विभिन्न शैलियों को प्रस्तुत करते हैं। अंततः, वे एक ही कार्य करते हैं। कुछ उपयोगकर्ता एक शैली को दूसरे पर पसंद करते हैं। यह कहा जा रहा है, हाइलाइट करने के लायक कुछ तकनीकी विचार भी हैं:

  1. मुखर और उम्मीद इंटरफेस को संशोधित नहीं Object.prototypeकरता है, जबकि करना चाहिए। इसलिए वे ऐसे माहौल में एक बेहतर विकल्प हैं जहाँ आप बदलाव नहीं कर सकते या नहीं करना चाहते Object.prototype

  2. मुखर और उम्मीद इंटरफेस हर जगह के बारे में कस्टम संदेशों का समर्थन करते हैं। उदाहरण के लिए:

    assert.isTrue(foo, "foo should be true");
    expect(foo, "foo should be true").to.be.true;
    

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

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

ध्यान दें कि assert.isTrue(foo), expect(foo).to.be.trueऔर foo.should.be.trueयदि आप एक कस्टम संदेश का उपयोग नहीं करते हैं, तो निम्नलिखित सभी आउटपुट और foo === 1:

    AssertionError: expected 1 to be true

इसलिए जबकि उम्मीद और इंटरफ़ेस को पढ़ने के लिए अच्छे हैं , ऐसा नहीं है कि एक इंटरफ़ेस दूसरे की तुलना में स्वाभाविक रूप से अधिक जानकारीपूर्ण है जब कोई दावा विफल हो जाता है। यह संदेश, जो सभी तीन इंटरफेस के लिए समान है, आपको यह नहीं बताता है कि आप वास्तव में क्या परीक्षण कर रहे थे, केवल यह कि आपको जो मूल्य मिला था, 1लेकिन आप चाहते थे true। यदि आप जानना चाहते हैं कि आप क्या परीक्षण कर रहे थे, तो आपको एक संदेश जोड़ना होगा।


8
ध्यान दें कि आप यह भी कर सकते हैंexpect(foo).to.equal(true, "foo should be true");
user5325596

मुझे expectमोचा के नवीनतम संस्करण का उपयोग करके कोई भी कस्टम संदेश नहीं मिल सकता है
मिरको

@ मिरको मोचा का संस्करण यहां महत्वपूर्ण नहीं है। क्या आप नवीनतम चाई का उपयोग कर रहे हैं?
लुई

मेरे लिए एक वैनिला एक्सप्रेस (4.16.3), मोचा (5.1.1), चाय (4.1.2), ची-http (4.0.0) परियोजना पर समान है। कस्टम संदेश कहीं भी प्रकट नहीं होता है जब कमांड के साथ चलाया जाता है mochaऔर परीक्षण में असफलता मिलती है।
जूहा अनटाइनन

15

मुझे उम्मीद है कि यह सरल उदाहरण उनके मतभेदों को स्पष्ट करता है

ज़ोर

var assert = require('chai').assert
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

assert.typeOf(foo, 'string'); // without optional message
assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
assert.equal(foo, 'bar', 'foo equal `bar`');
assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');

सभी मामलों में, मुखर शैली आपको मुखर कथन में अंतिम पैरामीटर के रूप में एक वैकल्पिक संदेश शामिल करने की अनुमति देती है। ये त्रुटि संदेशों में शामिल किए जाने चाहिए जो आपके दावे को पारित नहीं करना चाहिए।

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

उम्मीद

var expect = require('chai').expect
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(beverages).to.have.property('tea').with.lengthOf(3);

उम्मीद है कि आप किसी भी असफल अभिकथन के लिए मनमाने संदेशों को शामिल कर सकते हैं जो हो सकता है।

var answer = 43;

// AssertionError: expected 43 to equal 42.
expect(answer).to.equal(42);

// AssertionError: topic [answer]: expected 43 to equal 42.
expect(answer, 'topic [answer]').to.equal(42);

यह तब काम आता है जब गैर-वर्णनात्मक विषयों जैसे कि बूलियन या संख्याओं के साथ उपयोग किया जा रहा हो।

चाहिए

शैली को अपेक्षित इंटरफ़ेस के रूप में समान श्रृंखलाबद्ध अभिक्रियाओं के लिए अनुमति देता है, हालाँकि यह प्रत्येक वस्तु को आपकी श्रृंखला शुरू करने के लिए संपत्ति के साथ प्रदान करता है। इंटरनेट एक्सप्लोरर के साथ उपयोग किए जाने पर इस शैली में कुछ समस्याएं हैं, इसलिए ब्राउज़र संगतता के बारे में पता होना चाहिए।

var should = require('chai').should() //actually call the function
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
beverages.should.have.property('tea').with.lengthOf(3);

उम्मीद और चाहिए के बीच अंतर

सबसे पहले, ध्यान दें कि अपेक्षित अपेक्षा केवल अपेक्षित फ़ंक्शन का संदर्भ है, जबकि आवश्यकता के साथ, फ़ंक्शन निष्पादित किया जा रहा है।

var chai = require('chai')
, expect = chai.expect
, should = chai.should();

उम्मीद इंटरफ़ेस अपनी भाषा दावे चेनिंग के लिए एक प्रारंभिक बिंदु के रूप में एक समारोह प्रदान करता है। यह node.js और सभी ब्राउज़रों में काम करता है।

चाहिए इंटरफेस Object.prototype अपनी भाषा दावे के लिए प्रारंभिक बिंदु के रूप में एक गेटर प्रदान करने के लिए प्रदान करता है। यह Internet Explorer को छोड़कर सभी आधुनिक ब्राउज़र में नोड पर काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.