我目前正在编写一些功能,要求在axios处理响应时设置response.request.responseURL值。然而,我似乎不能用艾滋来设定这个价值。下面是我的测试结果:
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();
});
});
});这就是我的实际应用程序的样子:
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值(把它放在引号中,这样它就更容易读了):
日志:请求{解析:函数(a) {. },拒绝:函数(a) {. },配置:对象{适配器:函数mockAdapter(配置){. },transformRequest:对象{0:. },transformResponse:对象{0:.},超时: 0,xsrfCookieName:‘XSRF-令牌’,xsrfHeaderName:‘XSRF令牌’,maxContentLength:-1,validateStatus:函数validateStatus(状态){},headers: Object{Accept:.,my_csrf_token:.},方法:'get',url:'my_api_url/',data: un定义},headers: Object{Accept:'application/json,text/平原,/',my_csrf_token:'my_csrf_token'},url:‘my_api/’,timeout: 0,withCredentials: false,responseType:未定义}
这破坏了我的应用程序,因为应该始终定义responseURL。看起来它覆盖了我在艾灸中定义的请求。这不一定是坏事,因为我认为它需要这些东西才能正常工作。不过,如果我能为这个请求添加一些值,那就太好了。
那么,我如何在艾灸中为这个请求添加一个responseURL值呢?
发布于 2017-07-19 10:21:37
事实证明,设置responseURL是不可能的,因为我将它链接到respondWith()。在检查了艾莫斯源代码中的这个函数之后,我发现这里传递的值实际上只与返回的实际数据有关,而不是一个实际的响应对象。
我还看到respondWith()函数返回一个Promise对象,这是非常符合逻辑的。我认为我不应该在Promise上设置任何东西,而应该根据实际请求设置任何内容。因此,我将返回的Promise分配给一个promise变量,并解除了测试的.then()部分的链接。之后,我设置了请求的responseURL。然后我再次打电话给promise.then(),断言我的测试已经通过。
以下是我最终追求的目标:
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();
});
});
});https://stackoverflow.com/questions/45171181
复制相似问题