我正在使用fetch-mock
来测试我的客户端动作创建者,如果对BE进行了异步调用。虽然所有获取请求都运行良好,但我很难做同样的发布和发出请求。
附上一个代码示例,如果有效,我相信我的实际代码也可以正常工作。
我正在使用import fetchMock from 'fetch-mock'
来模拟响应,并使用require('isomorphic-fetch')
直接替换默认的fetch
我添加了一些注释但是我得到状态为200的响应(如果我将模拟的响应状态更改为400,我也得到它。问题是res.json()导致undefined而不是模拟的结果体。使用JSON .stringify是我在没有它之后无法使它工作的东西。
const responseBody = {response: 'data from the server'};
fetchMock.once('http://test.url', {
status: 200,
body: JSON.stringify(responseBody),
statusText: 'OK',
headers: {'Content-Type': 'application/json'},
sendAsJson: false
}, {method: 'POST'});
fetch('http://test.url',
{
method: 'post',
body: JSON.stringify({data: 'Sent payload'}),
headers : {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
})
.then(function (res) {
expect(res.status).toEqual(200); // Pass
res.json();
})
.then(function (json) {
console.log(json); // print undefine
expect(json).toEqual(responseBody); // Fail expected value to equal: {"response": "data from the server"} Received: undefined
done();
})
在你的第一个,你没有明确的回报,关键字return
如果你不做返回,那么下一个不知道该值。这就是你的json未定义的原因。
例如:
var myInit = { method: 'GET', mode: 'cors', cache: 'default' };
fetch('https://randomuser.me/api/',myInit)
.then(function(res) {
return res.json()
})
.then(function(r) {
console.log(r)
})
所以,对你来说:
const responseBody = {response: 'data from the server'};
fetchMock.once('http://test.url', {
status: 200,
body: JSON.stringify(responseBody),
statusText: 'OK',
headers: {'Content-Type': 'application/json'},
sendAsJson: false
}, {method: 'POST'});
fetch('http://test.url',
{
method: 'post',
body: JSON.stringify({data: 'Sent payload'}),
headers : {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
})
.then(function (res) {
expect(res.status).toEqual(200); // Pass
return res.json(); // return here
})
.then(function (json) {
console.log(json); // print undefine
expect(json).toEqual(responseBody); // Fail expected value to equal: {"response": "data from the server"} Received: undefined
done();
})