关于javascript:在moxios中指定response.request.responseURL

Specify response.request.responseURL in moxios

我目前正在尝试编写一些功能,要求axios处理响应时需要设置response.request.responseURL值。 但是,我似乎无法使用moxios设置此值。 这是我的测试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
it('resets list selection if input contents were replaced', (done) => {
    component.currently_selected_list_value = 10;
    component.last_called_url = 'henkiehoutman';

    let input = domElt.querySelector('input');
    ReactTestUtils.Simulate.change(input);

    moxios.wait(() => {
        let request = moxios.requests.mostRecent();
        request.respondWith({
            status: 200,
            response: [{
                customer_info_customers: ['', '', '', '', ''],
                domain_info_customers: {},
            }],
            request: {responseURL: 'banaan'}
        }).then(() => {
            // The contents were replaced, so it's best to forget whatever our selection was.
            expect(component.currently_selected_list_value).toEqual(-1);
            done();
        });
    });
});

这是我的实际应用程序的外观:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
onChange (event) {
    return axios.get(
        this.props.ApiUrl + encodeURIComponent(event.target.value)
    ).then(
        (response) => {
            let response_url = response.request.responseURL;  // This is the value I want to set manually.
            if(this.shouldHandleResponse(response_url)){
                this.last_called_url = response_url;
                let data = response.data;
                this.setState({results: data, dropdown: data.length > 0});

                if ( this.currently_selected_list_value > max_index) {
                    this.currently_selected_list_value = max_index;
                }
            }
        }
    );
},

但是,当我记录该值是什么时,它只会显示undefined。 这就是实际的response.request值(用引号引起来,这样它更具可读性):

LOG: Request{resolve: function (a) { ... }, reject: function (a) { ... }, config: Object{adapter: function mockAdapter(config) { ... }, transformRequest: Object{0: ...}, transformResponse: Object{0: ...}, timeout: 0, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, validateStatus: function validateStatus(status) { ... }, headers: Object{Accept: ..., X-CSRFToken: ...}, method: 'get', url: 'my_api_url/', data: undefined}, headers: Object{Accept: 'application/json, text/plain, /', X-CSRFToken: 'my_csrf_token'}, url: 'my_api_url/', timeout: 0, withCredentials: false, responseType: undefined}

这破坏了我的应用程序,因为应该始终定义responseURL。 看来它正在覆盖我在moxios中定义的请求。 这不一定是一件坏事,因为我认为它需要这些东西才能正常运行。 但是,如果我可以向此请求中添加一些值,那就太好了。

所以; 如何在Moxios中向此请求添加responseURL值?


事实证明,由于我将其链接到respondWith()的方式,无法设置responseURL。 在moxios源代码中检查了此功能后,我看到您在此处传递的值实际上仅与返回的实际数据有关,而与实际的响应对象无关。

我还看到respondWith()函数返回了Promise对象,这很合逻辑。 我认为我不应该在Promise上设置任何内容,而应在实际请求上设置任何内容。 因此,我将返回的Promise分配给了Promise变量,并取消了测试的.then()部分的链接。 之后,我设置了请求的responseURL。 然后,我再次调用promise.then()断言我的测试已通过。

这就是我最终追求的目标:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
it('resets list selection if input contents were replaced', (done) => {
    component.currently_selected_list_value = 10;
    component.last_called_url = 'henkiehoutman';

    let input = domElt.querySelector('input');
    ReactTestUtils.Simulate.change(input);

    moxios.wait(() => {
        let request = moxios.requests.mostRecent();
        let promise = request.respondWith({
            status: 200,
            response: [{
                customer_info_customers: ['', '', '', '', ''],
                domain_info_customers: {},
            }],
        });
        request.responseURL = 'banaan';

        promise.then(() => {
            // The contents were replaced, so it's best to forget whatever our selection was.
            expect(component.currently_selected_list_value).toEqual(-1);
            done();
        });
    });
});