Chai : 'should'구문으로 undefined를 테스트하는 방법


95

에 구축 차이가있는 AngularJS와 응용 프로그램을 테스트 튜토리얼, 나는 "해야"스타일을 사용하여 정의되지 않은 값에 대한 테스트를 추가 할. 이것은 실패합니다.

it ('cannot play outside the board', function() {
  scope.play(10).should.be.undefined;
});

"TypeError : Cannot read property 'should'of undefined"오류가 있지만 테스트는 "expect"스타일로 통과합니다.

it ('cannot play outside the board', function() {
  chai.expect(scope.play(10)).to.be.undefined;
});

"should"로 작업하려면 어떻게해야합니까?


1
"assert"를 사용한다면 쉽습니다. 다음과 같이 할 수 있습니다.assert.isUndefined(scope.play(10))
lukaserat

답변:


80

이것은 should 구문의 단점 중 하나입니다. 모든 객체에 should 속성을 추가하여 작동하지만 반환 값이나 변수 값이 정의되지 않은 경우 속성을 보유 할 객체가 없습니다.

문서는 예를 들어 몇 가지 해결 방법을 제공합니다 :

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});

14
should.not.exist값이 null올바른지 확인합니다.이 답변이 올바르지 않습니다. @daniel의 대답은 다음과 같습니다 should.equal(testedValue, undefined);.. 그것이 받아 들여진 대답이어야합니다.
Sebastian

7
나는이 대답 (안 문서 🙈) :-) 매월 온
랄프 카울링

52
should.equal(testedValue, undefined);

차이 문서에서 언급했듯이


12
맙소사, 설명 할게 뭐야? testValue는 === undefined로 예상되므로 테스트합니다. 많은 개발자가 먼저 testingValue를 먼저 넣은 다음 should와 연결하면 오류가 발생합니다.
daniel

5
이것은 기본적으로 작동하지 않으며 .NET 용 API 문서.equal() 에서 찾을 수 없습니다 . @OurManInBananas가 왜 설명을 요청했는지 이해할 수 있습니다. 예상 값에 대해 단일 인수를 허용하는 예상 체인 메서드 형식 대신 두 개의 인수를 허용하는 함수로 should를 예기치 않게 사용하는 것입니다. .should()@DavidNorman의 승인 된 답변 및이 문서에 설명 된대로 의 호출 된 버전을 가져 오기 / 요구하고 할당하여이를 달성 할 수 있습니다 .
gfullam

.equal구문이 오류 메시지를 훨씬 더 잘 생성 한다는 것을 알게 될 것입니다. 실패 할 때 더 설명적인 메시지를 출력 할 수 있기 때문입니다
jcollum

17

정의되지 않은 테스트

var should = require('should');
...
should(scope.play(10)).be.undefined;

null 테스트

var should = require('should');
...
should(scope.play(10)).be.null;

거짓 테스트, 즉 조건에서 거짓으로 취급

var should = require('should');
...
should(scope.play(10)).not.be.ok;

특히 유용하거나 직관적이지는 않지만 영리합니다!
thebenedict 2015-06-02

2
유용하지 않다? 그것은 bdd 스타일 IMO에서 정의되지 않은 테스트에 대한 최선의 대답이지만 다른 npm 패키지를 설치해야합니다 (해야 패키지). 다른 패키지를 설치할 가치가 있다고 생각하지 않습니다. 그래도 멋진 대답
Wagner Leonardi


8

정의되지 않은 테스트에 대해 should 문을 작성하는 데 어려움을 겪었습니다. 다음은 작동하지 않습니다.

target.should.be.undefined();

다음 해결책을 찾았습니다.

(target === undefined).should.be.true()

유형 검사로도 쓸 수 있다면

(typeof target).should.be.equal('undefined');

위의 방법이 올바른지 확실하지 않지만 작동합니다.

github의 유령에서 포스트에 따르면


1
이 구문을 사용하면 JavaScript가 이전 줄을 함수로 호출하려는 시도로 괄호로 묶인 표현식을 해석 할 수 있습니다 (세미콜론으로 줄을 끝내지 않는 경우).
bmacnaughton

5

이 시도:

it ('cannot play outside the board', function() {
   expect(scope.play(10)).to.be.undefined; // undefined
   expect(scope.play(10)).to.not.be.undefined; // or not
});

감사합니다. 위의 두 번째 시도에서 제가하고있는 일입니다. should 구문 으로 수행하는 방법을 이해하고 싶습니다 .
thebenedict

1

@ david-norman의 대답은 문서에 따라 정확하며 설정에 몇 가지 문제가 있었고 대신 다음을 선택했습니다.

(typeof scope.play (10)). should.be.undefined;


typeof연산자는 문자열을 반환 합니다 . 따라서이 주장은 전달 될 수 없습니다. cuz'undefined' !== undefined
dNitro

1

havenot키워드 의 조합을 잊지 마십시오 .

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');

0

함수 결과를 래핑 should()하고 "정의되지 않은"유형에 대해 테스트 할 수 있습니다 .

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.