1

我正在尝试使用 moxios 和 jest 测试对我的 axios 请求调用之一的拒绝。方法调用(调用 axios.get)会抛出错误,但不会调用 catch 块。

我的测试代码片段如下所示,

it('should call errorHandler method when request is rejected', done => {
        const errorResp = {
            status: 400,
            response: {message: 'invalid data'}
        };
        let mockFunction = jest.fn();
        Axios.getRaw('/test').then(mockFunction);
        moxios.wait(async () => {
            let req = moxios.requests.mostRecent();
            try {
                let rejection = await req.reject(errorResp);
                console.log('rejection', rejection);// rejection is undefined
                done();
            } catch (e) {
                console.log(e);
                // test assertions
                done(e);
            }

        })
    });

getRaw 方法,

const API_WRAPPER = TryCatchHandler.genericTryCatch;

export default {
  getRaw: path => API_WRAPPER(axios.get(`${SERVER_DOMAIN}${path}`)),
}

API_WRAPPER 方法,

export default {
    genericTryCatch: async (executionMethod) => {
        try {
            const response = await executionMethod;
            return response;
        } catch (error) {
            return ApiError.errorHandler(error);
        }
    }
}

errorHandler 方法,

export default {
    errorHandler: error => {
        const {status} = error;
        switch (status) {
            case 400:
            case 401:
            case 403:
            case 404:
            case 409:
            case 417:
            case 500:
            case 502:
                console.log("Error Handler says:", error);
                return error.response.data;
            default:
                console.log("Error Handler says:", error);
                let errorObj = {
                    errorMsg: error.message,
                    stack: error.stack
                };
                return errorObj;
        }
    }
}

由于未调用 catch 块,因此我无法断言我的测试用例。如何调用 catch?

4

1 回答 1

1

关于您提供的代码,有两点需要指出。

首先,您应该考虑到所有发出的请求Axios.getRaw都被包装了API_WRAPPER。如果请求导致错误,API_WRAPPER则返回处理错误的结果(通过errorHandler方法)。因此,调用Axios.getRaw将永远不会执行调用中存在的任何catch语句:

Axios.getRaw('/test').then(function() {
    // The code inside this method will always be executed, even when the request fails.
}).catch(function() {
    // The code inside this method will never be executed.
});

如果出现 400 错误(您在测试中测试的错误),该errorHandler方法将返回error.response.data. 但是在您的测试中,您创建的错误没有以下data属性:

const errorResp = {
    status: 400,
    response: {message: 'invalid data'}
};

因此,为了在您的测试中获得一些有意义的数据,您应该添加data具有一些值的属性。

其次,我认为您没有正确使用该moxios库。您正在获取最近的请求,然后您正在等待拒绝的结果:

let rejection = await req.reject(errorResp);
console.log('rejection', rejection);// rejection is undefined

但是调用req.reject不会返回一个承诺(事实上,它不会返回任何东西,这就是为什么你会undefined在你的console.log语句中看到一个)。您应该等待最初的Axios.getRaw承诺解决。

考虑到这一点,您可以像这样重写您的测试:

it('should call errorHandler method when request is rejected', function(done) {
    const errorResp = {
        status: 400,
        response: { message: 'invalid data', data: 'invalid data' }
    };

    // Store the promise so that we can wait for it to finish once we call the moxios reject method.
    const promise = Axios.getRaw('/test');

    moxios.wait(async function() {
        let req = moxios.requests.mostRecent();
        req.reject(errorResp);

        // As your code does not generate an error in a 400 failed request, we use the then method.
        promise.then(function(err) {
            // In a 400 error, the err.response.data is returned as the response.
            expect(err).toBe('invalid data');
            done();
        });
    });
});

希望这可以帮助!

于 2019-09-02T21:55:44.843 回答