我所有的GET请求都在通过,但POST请求失败了。当我将fetch-mock
从7.3.0
更新到7.3.1
或更高版本时,会发生这种情况。
console.warnUnmatched POST to url
错误fetch-mock: No fallback response defined for POST to url
http.js
export const get = (url) => {
const options = {
method: 'GET',
credentials: 'same-origin'
};
return fetch(url, options).then(handleJsonResponse);
};
export const post = (url, body) => {
const headers = {
'content-type': 'application/json',
'pragma': 'no-cache',
'cache-control': 'no-cache'
};
return fetch(url, {
credentials: 'same-origin',
method: 'POST',
cache: 'no-cache',
body: JSON.stringify(body),
headers
}).then(handleJsonResponse);
};
http.spec.js
const url = '/path/to/url'
describe('get', () => {
it('makes a GET request', async () => {
fetchMock.mock({
name: 'route',
matcher: url,
method: 'GET',
credentials: 'same-origin',
response: {
status: 200,
body: []
}
});
const response = await get(url);
expect(fetchMock.called()).toEqual(true);
expect(fetchMock.calls().length).toEqual(1);
expect(fetchMock.calls('route').length).toEqual(1);
expect(response).toEqual([]);
});
});
describe('post', () => {
const requestBody = {request: 'request'};
it('makes a POST request', async () => {
fetchMock.mock({
name: 'route',
matcher: url,
method: 'POST',
credentials: 'same-origin',
cache: 'no-cache',
body: JSON.stringify(requestBody),
headers: {
'content-type': 'application/json',
'pragma': 'no-cache',
'cache-control': 'no-cache'
},
response: {
status: 200,
body: []
}
});
const response = await post(url, requestBody);
expect(fetchMock.called()).toEqual(true);
expect(fetchMock.calls().length).toEqual(1);
expect(fetchMock.calls('route').length).toEqual(1);
expect(fetchMock.lastOptions().headers).toEqual({
'content-type': 'application/json',
'pragma': 'no-cache',
'cache-control': 'no-cache'
});
expect(response).toEqual([]);
});
});
关于导致这种情况的原因的任何想法?有没有办法获取更有意义的日志来帮助调试它?
我宁愿不走尝试nock或jest-fetch-mock的替代路径。
好的,经过几个小时的深入研究,我发现了问题所在。
在我的代码(以及上面的代码片段(中,我正在字符串化正文JSON.stringify(body)
。库的generate-matcher.js
JSON.parse(body)
解析它,然后比较两者 - 导致失败的点。我现在只是将其作为原始对象发送。
万一将来有其他人来到这里,我遇到了同样的错误,并伴有fetch-mock unmatched get
.
我看到了对此问题的响应提交给 fetch-mock,这促使我仔细检查我的预期值和模拟值。
事实证明,我的问题与描述的错误完全一样,由于拼写错误,我期望的模拟路由和调用的实际路由不匹配。