【问题标题】:catch is not invoked on moxios reject在 moxios 拒绝时不调用 catch
【发布时间】:2020-01-03 15:21:31
【问题描述】:

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

我的测试代码sn-p如下图,

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?

【问题讨论】:

    标签: reactjs jestjs axios moxios


    【解决方案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 不会返回一个promise(事实上,它不会返回任何东西,这就是你在console.log 语句中看到undefined 的原因)。您应该等待最初的 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();
            });
        });
    });
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2018-07-04
      相关资源
      最近更新 更多