使用fetch-mock和isomrphic-fetch模拟post请求时,res.json()是未定义的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用fetch-mock和isomrphic-fetch模拟post请求时,res.json()是未定义的相关的知识,希望对你有一定的参考价值。

我正在使用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();
})
  • 模拟GET请求工作得很好
  • 我也尝试将它与fetchMock.post一起使用,但没有运气
  • 如果有人知道我如何测试发送请求发送的有效负载,也会很感激(在文档中看不到任何参考)
答案

在你的第一个,你没有明确的回报,关键字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();
})

以上是关于使用fetch-mock和isomrphic-fetch模拟post请求时,res.json()是未定义的的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中使用 Redux-Saga/Fetch-mock 测试重定向路由

react native模拟mock接口

react native模拟mock接口

开玩笑地模拟获取响应的 blob 的 fetch() 函数

使用java加密和解密密码使用啥API和算法

如何使用 php 和 mysql 使用纬度和经度进行几何搜索