我正在学习如何用JavaScript编写测试,并且在这里有以下代码:
function handlePosts() {
var posts = [
{ id: 23, title: 'Me Gusta JS' },
{ id: 52, title: 'Ciudad Código' },
{ id: 105, title: 'Programar Ya' }
];
for (var i = 0; i < posts.length; i++) {
savePost(posts[i]);
}
}
会调用savePost
三次,但是我想确保当我或其他人使用forEach
辅助方法时,我的一项测试寻找forEach
实际打过savePost
3次。
我已经开发了一个测试来检查forEach
是否存在,换句话说,它是否与其他数组帮助器方法相对应地使用了,但是不确定如何测试其应做的事情。 / p>
describe('forEach', function() {
it('forEach method exists', () => {
expect(forEach).toBeDefined();
});
it('forEach is calling savePost three times', () => {
});
});
如果有人可以指导我完成这项工作,而不仅仅是寻找答案,还想学习如何思考这个问题。
我想象像expect(savePost.length).toEqual(3);
之类的东西,但是我不确定。
答案 0 :(得分:0)
The sinon framework可能值得考虑,因为它允许您在应用程序逻辑中创建函数间谍,然后可以在测试过程中查询这些间谍以确定是否,如何以及多久调用一次这些间谍。 / p>
就您的代码而言,您可以创建savePost()
函数的间谍“存根”,然后使用sinon确定{{调用savePost()
存根的次数。 1}}。 sinon框架provides assertion methods(例如handlePosts()
)是确定单元测试期间调用存根的次数的一种方式。
您需要对代码进行一些调整,以集成sinon并使所有内容协同工作。我不确定您当前在代码库中使用哪些约束,但是将sinon与代码集成的一种方法可能如下:
expectation.exactly()
function savePost(post) {
console.log("save post", post);
}
function handlePosts() {
var posts = [
{ id: 23, title: "Me Gusta JS" },
{ id: 52, title: "Ciudad Código" },
{ id: 105, title: "Programar Ya" }
];
for (var i = 0; i < posts.length; i++) {
/* Important to ensure handlePosts() invokes savePost() via the
exported module to enable the stubbing "replacement" and subsequent
callCount() assertion to work correctly */
module.exports.savePost(posts[i]);
}
}
module.exports = {
savePost,
handlePosts
};
希望这会有所帮助!