我正在使用mocha来测试我的JavaScript代码。该代码涉及html和css并实现了一个聊天应用程序。据我所知,Mocha可以通过将期望值与函数的返回值进行匹配来测试JavaScript函数。
但是,如果我想测试不返回值的函数怎么办?主要处理DOM元素的函数。 (例如附加图像)。
我如何在mocha中模拟DOM元素,然后测试函数是否成功生成适当的DOM元素?
我环顾四周,发现有可能使用selenium webdriver和jsdom。是否可以单独使用 mocha 进行此测试而没有其他额外接口?
答案 0 :(得分:1)
JSDOM很方便,因为它允许您测试“真正的”DOM实现,而无需在Web浏览器中运行。
如果你能run your unit tests inside a browser,你可以用同样的方式对DOM进行断言:
describe("the super special button", () => {
it("adds an image", (done) => {
const button = document.querySelector(".js-super-special");
button.click();
// give the browser a chance to update the DOM
setTimeout(() => {
const image = document.querySelector(".js-image")
// using assertion library, like chai
expect(image).to.not.beNull();
// or using a port of Node's `assert` from a bundler like browserify:
assert(image != null);
done();
})
})
});
答案 1 :(得分:0)
您必须在nodejs上下文中使用伪造的DOM API,并使它们在挂接Mocha之前全局化。
beforeEach(() => {
const dom = new JSDOM(
`<html>
<body>
</body>
</html>`,
{ url: 'http://localhost' },
);
global.window = dom.window;
global.document = dom.window.document;
});
在此处了解更多信息:https://seesparkbox.com/foundry/improve_unit_testing_with_mocha_chai_jsdom
答案 2 :(得分:0)
您可以使用 jsdom-global 包替代品,它也适用于 Mocha 之外。 mocha-jsdom 仍然有效,但更好地支持 jsdom-global。
npm install --save-dev --save-exact jsdom jsdom-global
修改 npm 测试脚本为:
"test": "mocha -r jsdom-global/register"
测试示例:app.test.js
import {JSDOM} from 'jsdom'; // can also use common js
describe('DOM', () => {
it('should log selector list', () => {
const dom = new JSDOM(
`<html>
<body>
<div class="card">1</div>
<div class="card">2</div>
<div class="card">3</div>
</body>
</html>`,
{url: 'http://localhost'},
);
});
global.document = dom.window.document;
console.log(document.querySelectorAll('.card'));
});