比较断言中的函数输出类型
Comparing the function output type in assertion
我正在努力使用 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>'
是我无法理解的那个 - 返回什么类型的输出以及这里应该使用什么断言?
以下是 deceze 在 his comment 中的含义。测试中:
ul.element.should.be.equals('<ul></ul>');
ul.element
是一个 JavaScript object。更准确地说,它是一个 DOM 节点。但是,<ul></ul>
是一个字符串。 Chai 与 ===
进行比较。如果您将 DOM 节点与使用 ===
的节点进行比较,唯一会 return 为真值的是 完全相同的 DOM 节点. "Exact same" 表示完全相同 JavaScript object。如果你这样做:
const node = document.createElement("ul");
console.log(node === node);
您在控制台上得到 true
。如果你这样做:
console.log(document.createElement("ul") === document.createElement("ul"));
你得到 false
因为两个操作数是两个不同的 object。出于您的目的,两个 DOM 节点可能是 "the same",但就 ===
而言,它们并不相同。由于没有字符串可以与 DOM 节点相同 object,因此您的测试失败。错误消息可能看起来令人困惑,但那是因为当 JSDOM 打印出错误时,它序列化了 DOM 节点。也就是然后JSDOM打印出DOM节点,其实是打印出了它的.outerHTML
属性的值,而.outerHTML
就是序列化的节点。
你想测试什么取决于你的最终目的是什么。如果你想测试元素的结构,你可以检查 .outerHTML
,比如:
ul.element.should.have.property("outerHTML").equal("<ul></ul>");
你的测试标题是 "should have addClass method"...所以也许你应该测试这个:
ul.element.should.have.property("addClass").be.a("function");
如果您打算将其作为测试代理来获得 HTMLElement
,我建议您改为这样做:
ul.element.should.be.instanceof(HTMLElement);
我正在努力使用 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>'
是我无法理解的那个 - 返回什么类型的输出以及这里应该使用什么断言?
以下是 deceze 在 his comment 中的含义。测试中:
ul.element.should.be.equals('<ul></ul>');
ul.element
是一个 JavaScript object。更准确地说,它是一个 DOM 节点。但是,<ul></ul>
是一个字符串。 Chai 与 ===
进行比较。如果您将 DOM 节点与使用 ===
的节点进行比较,唯一会 return 为真值的是 完全相同的 DOM 节点. "Exact same" 表示完全相同 JavaScript object。如果你这样做:
const node = document.createElement("ul");
console.log(node === node);
您在控制台上得到 true
。如果你这样做:
console.log(document.createElement("ul") === document.createElement("ul"));
你得到 false
因为两个操作数是两个不同的 object。出于您的目的,两个 DOM 节点可能是 "the same",但就 ===
而言,它们并不相同。由于没有字符串可以与 DOM 节点相同 object,因此您的测试失败。错误消息可能看起来令人困惑,但那是因为当 JSDOM 打印出错误时,它序列化了 DOM 节点。也就是然后JSDOM打印出DOM节点,其实是打印出了它的.outerHTML
属性的值,而.outerHTML
就是序列化的节点。
你想测试什么取决于你的最终目的是什么。如果你想测试元素的结构,你可以检查 .outerHTML
,比如:
ul.element.should.have.property("outerHTML").equal("<ul></ul>");
你的测试标题是 "should have addClass method"...所以也许你应该测试这个:
ul.element.should.have.property("addClass").be.a("function");
如果您打算将其作为测试代理来获得 HTMLElement
,我建议您改为这样做:
ul.element.should.be.instanceof(HTMLElement);