Must.js, объединяющий несколько утверждений в одно свойство

У меня есть такой объект:

var obj = {
    "uuid": "60afc3fa-920d-11e5-bd17-b9db323e7d51",
    "type": "candy"
}

Я хочу написать тест, который сначала проверяет, что объект имеет свойство 'uuid' в первую очередь, а затем это 'uuid' определенной длины (36 символов).

Попытка этого не работает

obj.should.have.property('uuid').which.should.have.length(36)

Это терпит неудачу с:

Uncaught AssertionError: expected Assertion {
  obj: '60afc3fa-920d-11e5-bd17-b9db323e7d51',
  params: { operator: 'to have property \'uuid\'' },
  negate: false } to have property 'length' of 36 (got [Function])

И это (что на самом деле не имеет синтаксического смысла в любом случае - так как это применимо к родительскому объекту, а не к значению)

obj.should.have.property('uuid').and.be.length(36)

Который терпит неудачу с:

Uncaught TypeError: usergridResponse.entity.should.have.property(...).which.should.be.equal.to is not a function

Даже это не работает:

obj.should.have.property('uuid').which.equals('60afc3fa-920d-11e5-bd17-b9db323e7d51')

Итак, как правильно связать утверждения относительно свойства объекта?

2 ответа

Решение

Я думаю, что это может быть лучшим вариантом:

var session = {
    "uuid": "60afc3fa-920d-11e5-bd17-b9db323e7d51",
    "type": "candy"
};

session.should.have.property('uuid').with.a.lengthOf(36);

Или это, если вы хотите выбрать should дважды, но я не думаю, что это правильный путь (объяснено ниже).

var session = {
    "uuid": "60afc3fa-920d-11e5-bd17-b9db323e7d51",
    "type": "candy"
};

session.should.have.property('uuid').which.obj.should.have.length(36);

Вы можете видеть их работу здесь:

https://jsfiddle.net/Lz2zsoks/

.an, .of, .a, .and, .be, .have, .with, .is, .which просто цепные цепи, которые ничего не делают.

Обновить

В ответ на @denbardadym я постараюсь объяснить, почему вы не должны использовать should дважды:

  • Вы не будете использовать его дважды на естественном языке, поэтому лучше не использовать его в тестах
  • Should.js не предназначен для использования таким образом. Вы не найдете ни одного примера такого использования в документации библиотеки.

Первое утверждение не удалось, потому что вы звоните .should дважды - второй раз, когда вы утверждаете на утверждение, это должно быть:

obj.should.have.property('uuid').which.have.length(36)

(сообщение об ошибке буквально говорит, что Assertion {...} не имеет длины свойства)

Второе утверждение не бросает для меня:

obj.should.have.property('uuid').and.be.length(36)

(ваше сообщение об ошибке выглядит так, будто это утверждение не для вас)

Последнее утверждение - нет .equals утверждение - должно быть .equal, И это повода для меня, потому что "0320a79a-920d-11e5-9b7a-057d4ca344ba" !== "60afc3fa-920d-11e5-bd17-b9db323e7d51"

Надеюсь, поможет.

Другие вопросы по тегам