使用 jsdom 和 Jest
Using jsdom and Jest
我正在尝试使用 Jest 对 angular 应用程序进行单元测试。为了测试 angular 绑定,我尝试使用 jsdom(N.B。我使用的是 v3.1.2,因为我使用的是节点而不是 IO)。当我需要使用 html 加载脚本时,测试似乎在加载脚本之前完成。
我已经简化了我的测试用例以使用来自 jsdom 的示例:
it('updates the view without error', function(){
var jsdom = require('../../../../node_modules/jsdom/lib/jsdom');
jsdom.env(
'<p><a class="the-link" href="https://github.com/tmpvar/jsdom">jsdom!</a></p>',
["http://code.jquery.com/jquery.js"],
function (errors, window) {
//console.log("contents of a.the-link:", window.$("a.the-link").text());
console.log("Completed");
expect(errors).toBeNull();
}
);
console.log('exiting...');
});
如果我运行这个测试,测试会通过但是不会打印"Completed"日志消息,我也可以用一些明显失败的东西来代替expect,比如expect(false ).toBeTruthy() 并且测试仍然 "pass"。如果我删除 jquery 的注入,那么一切都会按预期工作。
我应该如何确保在退出测试之前加载脚本?
更一般地说,在 Jest 中显式使用 jsdom 感觉有点不对劲。有没有更好的方法?
因为.env
可能是异步的,在调用回调之前测试会一直存在。
根据jest tutorial,你可以简单地将HTML分配给document.body.innerHTML
:
// Set up our document body
document.body.innerHTML =
'<div>' +
' <span id="username" />' +
' <button id="button" />' +
'</div>';
var $ = require('jquery');
或者,您可以使用 pit
而不是 it
和 return 来自函数的承诺。
我认为测试异步代码的最佳方法是传递 'done' 回调,如 docs 中所述。
您的代码将变为:
it('updates the view without error', function(done){
var jsdom = require('../../../../node_modules/jsdom/lib/jsdom');
jsdom.env(
'<p><a class="the-link" href="https://github.com/tmpvar/jsdom">jsdom!</a></p>',
["http://code.jquery.com/jquery.js"],
function (errors, window) {
//console.log("contents of a.the-link:", window.$("a.the-link").text());
console.log("Completed");
expect(errors).toBeNull();
done();
}
);
console.log('exiting...');
});
我正在尝试使用 Jest 对 angular 应用程序进行单元测试。为了测试 angular 绑定,我尝试使用 jsdom(N.B。我使用的是 v3.1.2,因为我使用的是节点而不是 IO)。当我需要使用 html 加载脚本时,测试似乎在加载脚本之前完成。
我已经简化了我的测试用例以使用来自 jsdom 的示例:
it('updates the view without error', function(){
var jsdom = require('../../../../node_modules/jsdom/lib/jsdom');
jsdom.env(
'<p><a class="the-link" href="https://github.com/tmpvar/jsdom">jsdom!</a></p>',
["http://code.jquery.com/jquery.js"],
function (errors, window) {
//console.log("contents of a.the-link:", window.$("a.the-link").text());
console.log("Completed");
expect(errors).toBeNull();
}
);
console.log('exiting...');
});
如果我运行这个测试,测试会通过但是不会打印"Completed"日志消息,我也可以用一些明显失败的东西来代替expect,比如expect(false ).toBeTruthy() 并且测试仍然 "pass"。如果我删除 jquery 的注入,那么一切都会按预期工作。
我应该如何确保在退出测试之前加载脚本? 更一般地说,在 Jest 中显式使用 jsdom 感觉有点不对劲。有没有更好的方法?
因为.env
可能是异步的,在调用回调之前测试会一直存在。
根据jest tutorial,你可以简单地将HTML分配给document.body.innerHTML
:
// Set up our document body
document.body.innerHTML =
'<div>' +
' <span id="username" />' +
' <button id="button" />' +
'</div>';
var $ = require('jquery');
或者,您可以使用 pit
而不是 it
和 return 来自函数的承诺。
我认为测试异步代码的最佳方法是传递 'done' 回调,如 docs 中所述。 您的代码将变为:
it('updates the view without error', function(done){
var jsdom = require('../../../../node_modules/jsdom/lib/jsdom');
jsdom.env(
'<p><a class="the-link" href="https://github.com/tmpvar/jsdom">jsdom!</a></p>',
["http://code.jquery.com/jquery.js"],
function (errors, window) {
//console.log("contents of a.the-link:", window.$("a.the-link").text());
console.log("Completed");
expect(errors).toBeNull();
done();
}
);
console.log('exiting...');
});