Чай: як перевірити на невизначеність із синтаксисом 'повинен'


95

Спираючись на цей посібник, який тестує додаток angularjs за допомогою chai, я хочу додати тест на невизначене значення, використовуючи стиль "повинен". Це не вдається:

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
Легко, якщо ви будете використовувати "assert", ви можете зробити це якassert.isUndefined(scope.play(10))
lukaserat

Відповіді:


80

Це один із недоліків синтаксису слід. Це працює, додаючи властивість 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
Я щомісяця приходжу до цієї відповіді (не до документів 🙈) :-)
Ральф Каулінг

52
should.equal(testedValue, undefined);

як зазначено в документації chai


12
omg, що тут пояснити? Ви очікуєте, що testValue === undefined, тож ви перевіряєте його. Багато розробників спочатку ставлять testValue спочатку, а потім ланцюжком його слід, і це закінчується помилкою ...
Даніель

5
Це не працює нестандартно, і це не знайдено в документації API для.equal() . Я розумію, чому @OurManInBananas просив пояснити. Це несподіване використання як функції, що приймає два аргументи, замість того, щоб передбачена ланцюгова форма методу приймала один аргумент для очікуваного значення. Ви можете досягти цього, лише імпортуючи / вимагаючи та призначаючи викликану версію, .should()як описано у прийнятій відповіді @DavidNorman та у цій документації .
ґфулам

Думаю, ви виявите, що такий .equalсинтаксис видає набагато кращі повідомлення про помилки, оскільки дозволяє виводити повідомлення, які є більш описовими, коли щось не вдається
jcollum

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;

Не особливо корисно чи інтуїтивно зрозуміло, але це розумно!
Тебенедикт

2
не корисний? Це найкраща відповідь для невизначеного тестування в стилі bdd IMO, однак для цього потрібно встановити інший пакет npm (пакет повинен бути), і я не думаю, що варто встановлювати інший пакет саме для цього, дивовижна відповідь
Вагнер Леонарді


8

Я намагався написати заяву слід для невизначених тестів. Наступне не працює.

target.should.be.undefined();

Я знайшов наступні рішення.

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

якщо може також написати це як перевірку типу

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

Не впевнений, чи правильно вказане вище, але це працює.

За повідомленням від ghost in 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 .
Тебенедикт

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()та перевірити на тип "невизначений":

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.