toBe (true) vs toBeTruthy () vs toBeTrue ()


165

무엇 사이의 차이 expect(something).toBe(true), expect(something).toBeTruthy()그리고 expect(something).toBeTrue()?

참고 toBeTrue()A는 사용자 정의 정규 도입 jasmine-matchers과 같은 다른 유용하고 편리한 정합 기 중 toHaveMethod()또는 toBeArrayOfStrings().


질문은 일반적인 것이지만 실제 예를 들어 요소가에 표시되는지 테스트하고 protractor있습니다. 이 경우 어떤 매처를 사용해야합니까?

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

3
나는 .toBe(true)== 생각 .toBeTrue()합니다. toBeTruthy ()는 true 일 때뿐만 아니라 123 일 때 "dfgdfg", [1,2,3] 등 if(x==true)은 기본적으로 if(x===true)진실한 반면, 진실한 것은 사실입니다.
dandavis


2
테스트하는 값이 무엇인지에 따라 다릅니다. toBeTruthy유형이 확실하지 않은 경우 사용 하는 것이 동일하다고 == true생각 .toBe(true)하는 경우와 동일한 지 확인하십시오 === true. 조언의 말씀. 잊어 ==!=자바 스크립트에 존재 다시 사용하지 않습니다. Truthy는 필요하지 않으며 초보자를위한 함정입니다. 사용 ===하고 !==대신.
Blindman67

@ Blindman67 조언에 감사드립니다. 우리는 심지어 한 eslint경우에 저희에게보고 ==또는 !=로 변경 제안 사용 ===하고 !==.
alecxe

답변:


231

여기서 묻는 질문과 같은 궁금한 점이 있으면 소스로 이동하십시오.

되려고()

expect().toBe() 다음과 같이 정의됩니다.

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

테스트는 다음과 ===같이 사용될 때 실제로 값이있는 expect(foo).toBe(true)경우에만 통과 함을 의미합니다 . 진실한 가치는 시험을 통과시키지 못합니다.footrue

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

(예, 비어 있든 아니든 배열은 진실입니다.)

toBeTrue ()

expect().toBeTrue()Jasmine-Matchers의 일부입니다 ( 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()무엇입니까?

궁극적으로 각도기는이 요청을 Selenium에게 전달합니다. 문서 에 의해 생성 된 값을한다고 .isDisplayed()A와 해결합니다 약속입니다 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

@dandavis 좋은 캐치
미가

@dandavis 사실이 아닙니다. 물건이 항상 진실한 것은 아닙니다. 그러나 그 진술 [] == false;true
micah

2
아니, 사실은 그 반대 유용하지 : 그것은 멍청한 놈 잡았다 ... 고려의 [""]==false또는 [0]== false; 비어 있지,하지 falsey, 단지기만 ...
dandavis

2
x == true예제에서와 같이 사용 하는 것은 오해의 소지가 있으며 위의 주석에서 알 수 있듯이 JavaScript의 진실성 개념을 설명하는 잘못된 방법입니다. JavaScript의 진실성 테스트는 if명령문에서 또는 부울 표현식에서 피연산자로 값이 작동하는 방식 입니다. 우리 는 다음 진술이 평가 될 1것이기 때문에 진실하다는 것을 알고 if (1)있습니다. 이와 []같은 이유로 truthy입니다 : 비록 [] == true평가 false, if ([])여전히 다음 문장의 원인이됩니다 평가하는, 우리가 알 수 있도록 []truthy입니다.
Jordan 달리기

13

Disclamer : 이것은 단순한 추측입니다

나는 모두가 읽기 쉬운 목록을 좋아한다는 것을 알고 있습니다.

  • toBe(<value>) -반환 값은 <value>
  • toBeTrue() -반환 값이 있는지 확인 true
  • toBeTruthy() -부울 값으로 캐스트 할 때 값이 정확한지 확인하십시오

    Truthy 값이 아닌 모든 값입니다 0, ''(빈 문자열), false, null, NaN, undefined또는[] (빈 배열) *을.

    * 실행 !![]하면 반환 true되지만 실행 [] == false하면 반환 true됩니다. 구현 방법에 따라 다릅니다. 다시 말해:(!![]) === ([] == false)


당신의 예에서 toBe(true)toBeTrue()같은 결과를 얻을 것입니다.


빈 배열이 잘못되었습니다.
micah

@MicahWilliamson 감사합니다! 답변 수정
Ismael Miguel

3
빈 배열은 JS에서 100 % 진실합니다alert(!![])
dandavis

[] == true콘솔에서 @dandavis 가 생성합니다 false. [] == false콘솔에서true
micah

@MicahWilliamson : 배열의 문자열 버전 (빈 문자열)을 true와 비교하기 때문입니다. 혼란 스러울 수 있습니다 ...
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)검사 를 적용하는 것을 기억 합니다 . 훨씬 간단합니다. 감사합니다.
alecxe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.