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


дом на этой учебник тестирование приложения angularjs с chai, я хочу добавить тест для неопределенного значения, используя стиль "должен". Это не удается:

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

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

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

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

9 82

9 ответов:

Это один из недостатков синтаксиса 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');
});
should.equal(testedValue, undefined);

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

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

тест для 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;

Я изо всех сил пытался написать заявление should для неопределенных тестов. Следующее не работает.

target.should.be.undefined();

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

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

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

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

не уверен, если это правильный путь, но он работает.

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

попробуйте это:

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

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

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

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

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

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

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