toBe (सच) बनाम toBeTruthy () बनाम toBeTrue ()


165

और expect(something).toBe(true), के बीच अंतर क्या है ?expect(something).toBeTruthy()expect(something).toBeTrue()

ध्यान दें कि toBeTrue()एक कस्टम मैचर है jasmine-matchersजो अन्य उपयोगी और आसान मिलान जैसे toHaveMethod()या के बीच पेश किया गया है toBeArrayOfStrings()


इस सवाल का मतलब सामान्य है, लेकिन, एक वास्तविक दुनिया उदाहरण के रूप में, मैं परीक्षण कर रहा हूं कि एक तत्व प्रदर्शित होता है protractor। इस मामले में मुझे किस मैचर का उपयोग करना चाहिए?

expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();

3
मुझे लगता है .toBe(true)== .toBeTrue()। toBeTruthy () केवल सच पर ही नहीं , बल्कि 123 पर , "dfgdfg", [1,2,3] आदि पर भी सत्य हो सकता है ... मूल रूप से सत्य हैं if(x==true), जबकि if(x===true)सत्य सत्य हैं।
डंडविस


2
यह इस बात पर निर्भर करेगा कि आप किस मूल्य का परीक्षण कर रहे हैं। toBeTruthyयदि आप उस प्रकार के अनिश्चित हैं, तो इसका उपयोग करें == trueजबकि मुझे संदेह .toBe(true)है कि === trueमाइंड के समान ही है, आप इसे सच करने के लिए परीक्षण करने के लिए फ़ंक्शन को कॉल करने के लिए एक छोटे से ओवरबोर्ड हैं। सलाह का शब्द,। भूल जाओ ==और !=जावास्क्रिप्ट में मौजूद है और फिर कभी इसका उपयोग न करें। सत्य की जरूरत नहीं है और शुरुआत के लिए एक जाल है। उपयोग करें ===और !==इसके बजाय।
ब्लिंडमैन 67

@ Blindman67 सलाह के लिए धन्यवाद, यह सही समझ में आता है। हमारे पास इसकी eslintरिपोर्टिंग भी है ==या !=नहीं ===और इसे बदलने के सुझाव देने के लिए उपयोग किया जाता है !==
एलेक्सी

जवाबों:


231

जब मैं कुछ करता हूं तो मुझे आश्चर्य होता है कि यहां पूछे गए प्रश्न स्रोत पर क्यों जाते हैं।

होने के लिए()

expect().toBe() की तरह परिभाषित किया गया है:

function toBe() {
  return {
    compare: function(actual, expected) {
      return {
        pass: actual === expected
      };
    }
  };
}

यह अपना परीक्षण करता है ===जिसका अर्थ है कि जब इसका उपयोग किया जाता है expect(foo).toBe(true), तो यह तभी पास होगा जब fooवास्तव में इसका मूल्य होगा true। सत्य मान परीक्षण पास नहीं करेगा।

toBeTruthy ()

expect().toBeTruthy() की तरह परिभाषित किया गया है:

function toBeTruthy() {
  return {
    compare: function(actual) {
      return {
        pass: !!actual
      };
    }
  };
}

जबरदस्ती टाइप करें

एक मूल्य सत्य है यदि इस मूल्य का बूलियन एक मूल्य का उत्पादन करता है true। एक बूलियन को !!पारित मूल्य के लिए मजबूर करके सच्चाई के लिए ऑपरेशन परीक्षण expect। ध्यान दें कि इसके विपरीत जो वर्तमान में स्वीकार किए जाते हैं जवाब देने के लिए निकलता है , == trueहै truthiness के लिए एक सही परीक्षण। आपको मजेदार चीजें पसंद आएंगी

> "hello" == true
false
> "" == true
false
> [] == true
false
> [1, 2, 3] == true
false

!!पैदावार का उपयोग करते हुए :

> !!"hello"
true
> !!""
false
> !![1, 2, 3]
true
> !![] 
true

(हाँ, खाली या नहीं, एक सरणी सत्य है।)

सत्य होने के लिए()

expect().toBeTrue()जैस्मीन-मैचर्स का हिस्सा है (जो jasmine-expectबाद में पंजीकृत jasmine-matchersपहले प्रोजेक्ट के बाद npm पर पंजीकृत है )।

expect().toBeTrue() की तरह परिभाषित किया गया है:

function toBeTrue(actual) {
  return actual === true ||
    is(actual, 'Boolean') &&
    actual.valueOf();
}

के साथ अंतर expect().toBeTrue()और यह है कि यह परीक्षण करता expect().toBe(true)है कि expect().toBeTrue()क्या यह किसी Booleanवस्तु के साथ काम कर रहा है । expect(new Boolean(true)).toBe(true)पास नहीं होने पर फेल हो expect(new Boolean(true)).toBeTrue()जाएगा। इसकी वजह है इस मज़ेदार बात:

> new Boolean(true) === true
false
> new Boolean(true) === false
false

कम से कम यह सत्य है:

> !!new Boolean(true)
true

किसके साथ उपयोग करने के लिए सबसे उपयुक्त है elem.isDisplayed()?

अंततः प्रोट्रेक्टर ने इस अनुरोध को सेलेनियम को सौंप दिया। प्रलेखन कहा गया है कि द्वारा उत्पादित मूल्य .isDisplayed()एक वादा है कि एक पर ले कर जाता है boolean। मैं इसे अंकित मूल्य और उपयोग में ले जाएगा .toBeTrue()या .toBe(true)। अगर मुझे ऐसा मामला मिला जहां कार्यान्वयन सत्य / झूठे मूल्यों को लौटाता है, तो मैं एक बग रिपोर्ट दर्ज करूंगा।


20

जावास्क्रिप्ट में ट्रू और सत्य हैं। जब कुछ सच होता है तो जाहिर तौर पर सही या गलत होता है। जब कोई चीज सत्य होती है तो वह बूलियन हो सकती है या नहीं, लेकिन "कास्ट" का मूल्य एक बूलियन है।

उदाहरण।

true == true; // (true) true
1 == true; // (true) truthy
"hello" == true;  // (true) truthy
[1, 2, 3] == true; // (true) truthy
[] == false; // (true) truthy
false == false; // (true) true
0 == false; // (true) truthy
"" == false; // (true) truthy
undefined == false; // (true) truthy
null == false; // (true) truthy

यह चीजों को सरल बना सकता है यदि आप जांचना चाहते हैं कि क्या स्ट्रिंग सेट है या किसी सरणी में कोई मान है।

var users = [];

if(users) {
  // this array is populated. do something with the array
}

var name = "";

if(!name) {
  // you forgot to enter your name!
}

और जैसा कहा गया है। expect(something).toBe(true)और expect(something).toBeTrue()ऐसा ही है। लेकिन expect(something).toBeTruthy()दोनों में से एक भी ऐसा नहीं है।


2
[] == false;यह सही नहीं है, यह कथन स्वयं गलत है क्योंकि वस्तुएं हमेशा
सत्य होती हैं

@dandavis अच्छा पकड़
मीका

@ डांडवीस सच नहीं है। वस्तुएं हमेशा सत्य नहीं होती हैं। लेकिन वह कथन [] == false;हैtrue
माइक

2
नहीं, यह उपयोगी नहीं है, बस वास्तव में विपरीत है: यह एक noob गोटा है ... पर विचार करें [""]==falseया [0]== false; खाली नहीं, फालसे नहीं, सिर्फ
धोखेबाज

2
x == trueजैसा कि आप अपने उदाहरणों में रखते हैं, का उपयोग करना एक भ्रामक है और, जैसा कि उपरोक्त टिप्पणियां दिखाती हैं, जावास्क्रिप्ट में सच्चाई की अवधारणा को चित्रित करने का गलत तरीका। जावास्क्रिप्ट में सच्चाई की असली परीक्षा यह है कि एक मूल्य एक ifबयान में या एक बूलियन अभिव्यक्ति में एक ऑपरेंड के रूप में कैसे व्यवहार करता है । हम जानते हैं 1कि सत्य है क्योंकि if (1)अगले बयान का मूल्यांकन किया जाएगा। इसी तरह []एक ही कारण के लिए सत्य है: भले ही [] == trueमूल्यांकन करता है false, if ([])फिर भी अगले बयान का मूल्यांकन किया जाएगा, इसलिए हम जानते हैं []कि सत्य है।
जॉर्डन रनिंग

13

डिस्क्लेमर : यह सिर्फ एक जंगली अनुमान है

मुझे पता है कि हर कोई आसानी से पढ़ी जाने वाली सूची पसंद करता है:

  • toBe(<value>) - लौटाया गया मान वैसा ही है <value>
  • toBeTrue() - चेक अगर लौटा मूल्य है true
  • toBeTruthy() - जाँच करें कि क्या मूल्य, जब एक बूलियन को डाला जाता है, तो एक सत्य मूल्य होगा

    Truthy मूल्यों सभी मूल्यों है कि नहीं कर रहे हैं 0, ''(रिक्त स्ट्रिंग), false, null, NaN, undefinedया [](खाली सरणी) *।

    * ध्यान दें कि जब आप दौड़ते हैं !![], तो यह वापस लौटता है true, लेकिन जब आप [] == falseइसे चलाते हैं तो यह भी लौटता है true। यह इस बात पर निर्भर करता है कि इसे कैसे लागू किया जाता है। दूसरे शब्दों में:(!![]) === ([] == false)


अपने उदाहरण पर, toBe(true)और toBeTrue()वही परिणाम देगा।


एक खाली सरणी गलत है।
माइक

@MicahWilliamson धन्यवाद! जवाब तय किया
इस्माईल मिगुएल

3
जेएस में खाली सरणियाँ 100% alert(!![])
सत्य हैं

[] == trueआपके कंसोल में @dandavis का उत्पादन होता है false[] == falseआप में कंसोल का उत्पादन होता हैtrue
micha

@MicahWilliamson: ऐसा इसलिए है क्योंकि your'e सरणी के स्ट्रिंग संस्करण (खाली स्ट्रिंग) की तुलना सही है। यह भ्रमित करने वाला हो सकता है ...
dandavis

1

वहाँ बहुत सारे अच्छे जवाब हैं, मैं सिर्फ एक परिदृश्य जोड़ना चाहता था जहाँ इन उम्मीदों का उपयोग सहायक हो। element.all(xxx)यदि सभी तत्वों को एक बार में प्रदर्शित किया जाता है, तो मुझे यह जांचने की आवश्यकता है कि क्या मैं उपयोग कर सकता हूं -

expect(element.all(xxx).isDisplayed()).toBeTruthy(); //Expectation passes
expect(element.all(xxx).isDisplayed()).toBe(true); //Expectation fails
expect(element.all(xxx).isDisplayed()).toBeTrue(); //Expectation fails

कारण किया जा रहा है .all()मानों की एक सरणी देता है और उम्मीदों के सभी प्रकार इतना ( getText, isPresent, आदि ...) के साथ किया जा सकता है toBeTruthy()जब .all()चित्र में आता है। उम्मीद है की यह मदद करेगा।


अच्छा! मुझे याद है reduce()कि एक एकल मूल्य में बूलियन की सरणी और फिर toBe(true)चेक लागू करना । यह बहुत सरल है, धन्यवाद।
एलेक्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.