fetch-mock-jest .post 解析为 {"size":0,"timeout":0}

如何解决fetch-mock-jest .post 解析为 {"size":0,"timeout":0}

我正在尝试对发送 post 请求的函数进行单元测试,然后 API 返回一个 json 对象。我正在尝试使用 jest 和 fetch-mock-jest 来做到这一点。

现在测试函数接收到的不是预期的有效载荷 {"size":0,"timeout":0} 并抛出错误 invalid json response body at reason: Unexpected end of JSON input。很确定有一些我没有看到的基本内容。我在这件事上花费的时间比我想承认的要多得多,但没有任何进展。

编辑:总的来说,我对玩笑和单元测试很陌生,所以如果有人有更好的建议来模拟 fetch,请告诉我。

测试文件

import fetchMock from 'fetch-mock-jest'

import {
  refreshAccesstoken,isTokenExpired
} from '../../../lib/access/Accesstoken'

describe('Accesstoken Component...',() => {
it('...Refreshes Accesstoken',async () => {
    const responseBody = { accesstoken: taiDeveloperTokenValid } // The payload I want the Accesstoken.refreshAccesstokento get
    setAccesstoken(taiDeveloperTokenExpired)

    process.env.NEXT_PUBLIC_AUTH_API_HTTPS_URL = 'http://new-api.com'
    fetchMock.post(
      `${process.env.NEXT_PUBLIC_AUTH_API_HTTPS_URL}/refreshToken`,new Promise((res) =>
        setTimeout(
          () =>
            res({
              status: 200,body: JSON.stringify(responseBody),statusText: 'OK',headers: { 'Content-Type': 'application/json' },}),50,),)
    const refreshAccesstokenResponse = await refreshAccesstoken()
    expect(refreshAccesstokenResponse).toBe(true)
    expect(isTokenExpired()).toBe(false)
  })
  }

我正在测试的功能

import fetch from 'isomorphic-unfetch'

export const refreshAccesstoken = async (): Promise<boolean> => {
  try {
    const response = await fetch(
      `${process.env.NEXT_PUBLIC_AUTH_API_HTTPS_URL}/refreshToken`,{
        method: 'POST',credentials: 'include',},)
    console.log(JSON.stringify(await response)) // this prints {"size":0,"timeout":0}
    const data = await response.json()
    accesstoken = data.accesstoken
    return true
  } catch (error) {
    console.log(error) // this prints  FetchError { message: 'invalid json response body at  reason: Unexpected end of JSON input',type: 'invalid-json'
    return false
  }
}

解决方法

您可以使用 jest.mock(moduleName,factory,options) 自行模拟 isomorphic-unfetch 模块。不需要 fetch-mock-jest 模块。

例如

main.ts

import fetch from 'isomorphic-unfetch';

export const refreshAccessToken = async (): Promise<boolean> => {
  try {
    const response = await fetch(`${process.env.NEXT_PUBLIC_AUTH_API_HTTPS_URL}/refreshToken`,{
      method: 'POST',credentials: 'include',});
    const data = await response.json();
    const accessToken = data.accessToken;
    console.log(accessToken);
    return true;
  } catch (error) {
    console.log(error);
    return false;
  }
};

main.test.ts

import { refreshAccessToken } from './main';
import fetch from 'isomorphic-unfetch';
import { mocked } from 'ts-jest/utils';

jest.mock('isomorphic-unfetch');

const fetchMocked = mocked(fetch);

describe('66009798',() => {
  afterAll(() => {
    jest.resetAllMocks();
  });
  it('should get access token',async () => {
    process.env.NEXT_PUBLIC_AUTH_API_HTTPS_URL = 'http://new-api.com';
    const data = { accessToken: '123' };
    const mResponse = { json: jest.fn().mockResolvedValueOnce(data) };
    fetchMocked.mockResolvedValueOnce(mResponse as any);
    const actual = await refreshAccessToken();
    expect(actual).toBeTruthy();
    expect(fetch).toBeCalledWith('http://new-api.com/refreshToken',});
    expect(mResponse.json).toBeCalledTimes(1);
  });
});

单元测试结果:

 PASS  examples/66009798/main.test.ts (13.604 s)
  66009798
    √ should get access token (37 ms)

  console.log
    123

      at examples/66009798/main.ts:11:13

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files |   83.33 |      100 |     100 |      80 |
 main.ts  |   83.33 |      100 |     100 |      80 | 14-15
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed,1 total
Tests:       1 passed,1 total
Snapshots:   0 total
Time:        15.989 s

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?