如何测试forEach调用过savePost三次?

时间:2019-03-01 05:10:20

标签: javascript arrays testing foreach

我正在学习如何用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);之类的东西,但是我不确定。

1 个答案:

答案 0 :(得分:0)

The sinon framework可能值得考虑,因为它允许您在应用程序逻辑中创建函数间谍,然后可以在测试过程中查询这些间谍以确定是否,如何以及多久调用一次这些间谍。 / p>

就您的代码而言,您可以创建savePost()函数的间谍“存根”,然后使用sinon确定{{调用savePost()存根的次数。 1}}。 sinon框架provides assertion methods(例如handlePosts())是确定单元测试期间调用存根的次数的一种方式。

您需要对代码进行一些调整,以集成sinon并使所有内容协同工作。我不确定您当前在代码库中使用哪些约束,但是将sinon与代码集成的一种方法可能如下:

App.js

expectation.exactly()

Test.js

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
};

希望这会有所帮助!