gpt4 book ai didi

javascript - 为什么这个模拟 api 不能按预期工作?

转载 作者:行者123 更新时间:2023-11-30 06:51:50 24 4
gpt4 key购买 nike

我正在尝试测试这个简单的 api 模块:

import fetch from 'isomorphic-fetch';

export const getJson = (endpoint: string) => {
const options = { credentials: 'include', method: 'GET' };

return fetch(endpoint, options)
.then(response => response.json()
.then(json => {
if (response.ok) return json;
return Promise.reject(json.errors);
})
)
.catch(error => {
if (error.constructor === Array) return error;
return [error.message];
});
};

在这个测试中,我在模拟 fetch:

import { getJson } from '../api';

const mockResponse = (status, statusText, response) => {
return new window.Response(response, {
status: status,
statusText: statusText,
headers: {
'Content-type': 'application/json'
}
});
};

describe('api middleware', () => {
describe('getJson', () => {
it('should return the response on success', () => {
const expected = { data: ['data'], meta: {} };
const body = JSON.stringify(expected);

window.fetch = jest.fn().mockImplementation(() =>
Promise.resolve(mockResponse(200, null, body)));

return getJson('http://endpoint').then(actual => expect(actual).toEqual(expected));
});
});
});

但是测试失败了:

Expected value to equal:
{"data": ["data"], "meta": {}}
Received:
["Unexpected end of JSON input"]

Difference:

Comparing two different types of values:
Expected: object
Received: array

我无法弄清楚为什么这不起作用。为什么我会收到“JSON 输入的意外结束”错误?以及如何在测试中成功地在本地模拟提取?在 this medium post它以基本相同的方式完成..

最佳答案

显然测试仍在使用全局获取库,而不是我的补丁版本。解决方案是:

  1. 删除“isomorphic-fetch”模拟(在项目根目录的 __mocks__ 中)。
  2. 使用 import 'isomorphic-fetch;
  3. 在我的项目的根目录导入一次 'isomorphic-fetch'
  4. 删除我的 api 模块顶部的“isomorphic-fetch”导入(因为它已经在入口点导入了
  5. 将测试更新为:

测试:

// to make the Response constructor available
import 'isomorphic-fetch';
import { getJson } from '../api';

describe('api middleware', () => {
describe('getJson', () => {
beforeEach(() => {
window.fetch = jest.genMockFunction();
});

it('should return the response on success', () => {
const expected = { data: ['data'], meta: {} };
const body = JSON.stringify(expected);
const init = { status: 200, statusText: 'OK' };

window.fetch.mockReturnValueOnce(Promise.resolve(new Response(body, init)));

return getJson('http://endpoint').then(actual => expect(actual).toEqual(expected));
});
});
});

关于javascript - 为什么这个模拟 api 不能按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40043912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com