[javascript] toBe (true) vs toBeTruthy () vs toBeTrue ()

무엇 사이의 차이 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();



답변

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

되려고()

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). 구현이 진실 / 거짓 값을 반환하는 경우를 발견하면 버그 보고서를 제출합니다.


답변

자바 스크립트에는 진실과 진실이 있습니다. 무언가가 진실 일 때 그것은 분명히 진실이거나 거짓입니다. 어떤 것이 진실되면 부울 일 수도 있고 아닐 수도 있지만, “캐스트”값은 부울입니다.

예.

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()둘 중 하나와 동일하지 않습니다.


답변

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

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

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

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

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


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


답변

거기에는 많은 좋은 답변이 있습니다. 이러한 기대치의 사용법이 도움이 될 수있는 시나리오를 추가하고 싶었습니다. 를 사용하여 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()그림으로 온다. 도움이 되었기를 바랍니다.


답변