Chai: как тестировать для undefined с синтаксисом 'should'

Основываясь на этом учебном пособии по тестированию приложения angularjs с chai, я хочу добавить тест для значения undefined, используя "should" стиль. Это не удается:

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

с ошибкой "TypeError: Невозможно прочитать свойство 'should' из undefined", но тест проходит со стилем "ожидать":

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

Как я могу заставить его работать с "должен"?

Ответ 1

Это один из недостатков синтаксиса if. Он работает, добавляя свойство all ко всем объектам, но если возвращаемое значение или значение переменной undefined, объект не имеет свойства.

Документация дает некоторые обходные пути, например:

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

Ответ 2

should.equal(testedValue, undefined);

как указано в документации chai

Ответ 3

(typeof scope.play(10)).should.equal('undefined');

Ответ 4

Тест для undefined

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;

Ответ 5

Я изо всех сил пытался написать инструкцию if для тестов undefined. Не работает.

target.should.be.undefined();

Я нашел следующие решения.

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

если он также может записать его как проверку типа

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

Не уверен, что это правильно, но он работает.

Согласно сообщению с призрака в github

Ответ 6

Попробуйте следующее:

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
});

Ответ 7

Ответ @david-norman верен в соответствии с документацией, у меня было несколько проблем с настройкой и вместо этого выбрал следующее.

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

Ответ 8

Вы можете обернуть результат своей функции в should() и протестировать тип "undefined":

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

Ответ 9

Не забывайте о комбинации ключевых слов have и not:

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