Сравнение типа вывода функции в утверждении - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь написать тестовое утверждение, используя chai, mocha и JS-DOM.У меня есть простая функция вроде:

function HtmlElement(el) {
  this.element = (el instanceof HTMLElement) ? el :document.createElement(el);
}

в тестах, которые у меня есть:

it('should have addClass method', function () {
  const ul = (new HtmlElement('ul'));
  ul.element.should.be.equals('<ul></ul>'); // Outputs the actual UL 
});

, но ошибка:

AssertionError: expected <ul></ul> to equal '<ul></ul>'

- это то, что я могу 'не понимаю - какой тип вывода возвращается и какое утверждение следует использовать здесь?

1 Ответ

0 голосов
/ 15 февраля 2019

Вот что означало deceze в его комментарии .В тесте:

ul.element.should.be.equals('<ul></ul>');

ul.element - это объект JavaScript.Точнее, это DOM-узел.Тем не менее, <ul></ul> является строкой.Чай делает сравнение с ===.Если вы сравниваете узел DOM с чем-то, использующим ===, единственное, что вернет истинное значение, - это точно такой же узел DOM .«Точно так же» означает точно такой же объект JavaScript.Если вы сделаете:

const node = document.createElement("ul");
console.log(node === node);

Вы получите true на консоли.Если вы сделаете это:

console.log(document.createElement("ul") === document.createElement("ul"));

Вы получите false, потому что два операнда - это два разных объекта.Для ваших целей два узла DOM могут быть «одинаковыми», но они не одинаковы, если рассматривать ===.Поскольку ни одна строка не может быть тем же объектом, что и узел DOM, ваш тест не пройден.Сообщение об ошибке может показаться запутанным, но это потому, что когда JSDOM выводит ошибку, она сериализует узел DOM.То есть, затем JSDOM распечатывает узел DOM, он действительно выводит значение своего свойства .outerHTML, а .outerHTML - это сериализация узла.

То, что вы хотите проверить, зависит от того, чтоваша конечная цельЕсли вы хотите проверить структуру элемента, вы можете проверить .outerHTML, что-то вроде:

ul.element.should.have.property("outerHTML").equal("<ul></ul>");

Название вашего теста: "должен иметь метод addClass" ... так что, возможно, вам следуеттестирование этого:

ul.element.should.have.property("addClass").be.a("function");

Если бы вы хотели, чтобы это был прокси-сервер для тестирования, чтобы вы получили HTMLElement, я бы предложил сделать это вместо:

ul.element.should.be.instanceof(HTMLElement);
...