Чай: как проверить неопределенность с синтаксисом 'следует'

95

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

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

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

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

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

Бенедикт
источник
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);. Это должен быть принятый ответ.
Себастьян
7
Я прихожу к этому ответу (не к документации 🙈) ежемесячно :-)
Ральф Коулинг
53
should.equal(testedValue, undefined);

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

Дэниел
источник
12
омг, что тут объяснять? Вы ожидаете, что testValue будет === undefined, поэтому вы его протестируете. Многие разработчики сначала помещают testValue, а затем связывают его с should, и это заканчивается ошибкой ...
Дэниел
5
Это не работает из коробки, и этого нет в документации API для.equal() . Я могу понять, почему @OurManInBananas попросил объяснений. Неожиданное использование should в качестве функции, принимающей два аргумента, вместо ожидаемой формы связанного метода, принимающей один аргумент для ожидаемого значения. Вы можете достичь этого только путем импорта / запроса и назначения вызванной версии, .should()как описано в принятом ответе @DavidNorman и в этой документации .
gfullam
Я думаю, вы обнаружите, что этот .equalсинтаксис дает гораздо лучшие сообщения об ошибках, потому что он позволяет вам выводить сообщения, которые более
информативны,
17

Тест на неопределенное

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

Проверить на нуль

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

Проверка на ложность, т.е. считается ложной в условиях

var should = require('should');
...
should(scope.play(10)).not.be.ok;
Петр Дочев
источник
Не особенно полезно или интуитивно понятно, но это умно!
thebenedict 02
2
не полезно? Это лучший ответ для неопределенного тестирования в стиле bdd IMO, однако он должен установить другой пакет npm (пакет should), и я не думаю, что стоит устанавливать другой пакет только для этого, но отличный ответ
Вагнер Леонарди,
16
(typeof scope.play(10)).should.equal('undefined');
теддыхан
источник
8

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

target.should.be.undefined();

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

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

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

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

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

Согласно сообщению от ghost в 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 06
1

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

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

Энди Полхилл
источник
typeofоператор возвращает строку ; так что это утверждение не могло быть принято; cuz'undefined' !== undefined
dNitro
1

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

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');
Яровой
источник
0

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

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
Pegli
источник