【发布时间】:2017-06-01 07:55:52
【问题描述】:
我们正在尝试弄清楚如何将Jest.js 与Knockout.js 结合使用。本质上,我们想要创建一个小的 DOM 片段,例如:
<div class="card" data-bind="component: myCustomComponent"/>
然后可以使用自定义视图模型调用ko.applyBindings(),并使用该 DOM 片段并让 Knockout 将组件加载到视图模型上,这样我们就可以进行 Jest 快照测试。
我们正在努力解决的问题是,我如何有效地创建一个适合 ko.applyBindings() 的 DOM 片段,因为它需要一个我们不确定如何创建/选择的 DOM 节点。
编辑
我已经尝试过@user3297291 的答案,并整理了以下示例,不幸的是我无法开始工作。这是我整理的示例:
const jsdom = require("jsdom");
const ko = require("knockout");
describe("Knockout Test", () => {
beforeAll(() => {
ko.components.register("greeting", {
viewModel: function(params) {
//params.name = "test";
//this.message = ko.observable(`Hello ${params.name}`);
this.message = ko.observable("Hello World!");
},
template: '<span data-bind="text: message"/>'
});
});
it("test pass", (done) => {
jsdom.env(`<div class="wrapper"></div>`, [], (err, window) => {
var wrapper = window.document.querySelector(".wrapper");
var element = window.document.createElement("div");
element.setAttribute("data-bind", 'component: "greeting"');
wrapper.appendChild(element);
ko.applyBindings({ name: 'Ian' }, wrapper);
setTimeout(() => {
console.log(element.innerHTML);
expect(element.innerHTML).toMatchSnapshot();
done();
}, 10);
}
);
});
});
如果我将element.setAttribute("data-bind", 'component: "greeting"'); 修改为element.setAttribute("data-bind", 'text: name');,那么它可以正常工作,但是加载一个组件(这是我真正想要做的)似乎总是导致一个空的element.innerHTML。
如果你想重现,这里有一个 package.json,我正在运行npm run jest:
{
"name": "kotest",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"jest": "jest"
},
"author": "",
"license": "ISC",
"dependencies": {
"jasmine": "^2.5.3",
"jest": "^18.1.0",
"jsdom": "^9.9.1",
"knockout": "^3.4.1"
}
}
【问题讨论】:
-
您可以使用 jQuery 或 vanilla js 和 pass it as the second argument to
applyBindingsAFAIK 创建一个 DOM 元素。你试过了吗? -
@Jeroen 你确定你可以在 nodejs/jest 环境中做到这一点吗?我已经尝试过了,似乎 jQuery 无法真正创建 DOM 元素,它会返回一个包含空对象的数组。这反过来又可以防止敲除绑定
-
不,不完全确定。我对 jestjs 了解不多,也没有从您的问题中了解您正在使用 nodejs 环境。过去,我通常使用 Chutzpah 对 KnockoutJS 代码运行 QUnit 测试,AFAIK 在后台使用 PhantomJS 为您提供 DOM 东西。希望其他人可以提供帮助。祝你好运!
-
@Jeroen 啊,很公平。是的,不幸的是我相信 Jest 只在节点环境中运行。也许我会在我的问题中添加一个额外的标签。
-
我已经使用
jsdom在我的答案中尝试了一些代码来模仿window/DOM,并且没有遇到任何问题。很想知道它是否有任何帮助......
标签: javascript node.js knockout.js jestjs