如何在JEST测试用例中检查全局获取的响应

时间:2019-05-29 07:44:10

标签: node.js reactjs express jestjs

所以,我正在用玩笑来测试我的调用fetch()APi来获取数据的节点函数,现在当我为相同的示例编写测试用例时,我得到了类似的错误:

expect(received).resolves.toEqual()

    Matcher error: received value must be a promise

    Received has type:  function
    Received has value: [Function mockConstructor]

我的功能:

 export function dataHandler (req, res, next) {
    const url= "someURL"
    if (url ) {
        return fetch(url )
            .then((response) => response.json())
            .then((response) => {
                if (response.data) {
                    console.log(response);
                    res.redirect(somewhere`);
                } else {
                    throw Error(response.statusText);
                }
            })
            .catch((error) => {
                next(error);
            });
    } 
}

测试用例:

 it('check if fetch returning the response', async () => {
        // Setup
        const req = jest.fn(),
            res = { redirect: jest.fn() },
            next = jest.fn();
        global.fetch = jest.fn().mockImplementation(() => {
            return new Promise((resolve) =>
                resolve({
                    json: () => {
                        return { data: "hello"};
                    }
                })
            );
        });
        await middlewares.dataHandler(req, res, next);
        //  Assert      
        expect(global.fetch).resolves.toEqual({ data: "hello" });
    });

请注意,我没有使用任何模拟API,并且宁愿不使用。

有人可以帮助我解决问题吗?

1 个答案:

答案 0 :(得分:1)

.resolves只能与Promise一起使用。

global.fetch是一个函数,因此Jest会引发错误。

如果您试图断言通过调用Promise返回的global.fetch可以解析为带有返回json的{​​{1}}函数的对象,则可以执行以下操作:< / p>

{ data: 'hello' }

...但是我怀疑您确实是在尝试验证expect((await global.fetch()).json()).toEqual({ data: 'hello' }); // Success! 是否存在,并且response.data是用res.redirect调用的,在这种情况下,您的主张应该是这样的:

'somewhere'