gpt4 book ai didi

javascript - 在 Jest 中为 es6 类的静态方法创建模拟实现

转载 作者:行者123 更新时间:2023-12-02 21:24:18 25 4
gpt4 key购买 nike

我正在测试一个函数,该函数内部从(es6 类) Controller 调用静态方法,该方法返回 API 获取的结果。由于我正在编写单元测试并且 Controller 有自己的测试,因此我想模拟(技术上伪造)类中的静态方法以提供不同类型的响应。

// Controller.js
class Controller {
static async fetchResults() {} // the method I want to fake
}
// func.js - the function I am writing the test for
const func = async (ctx) => {
const data = await Controller.fetchResults(ctx.req.url)

if (containsErrors(data)) ... // do some logic

return { ...data, ...otherStuff }
}

这种伪造static async fetchResults()的尝试不会执行任何操作,并且测试会尝试调用原始 Controller 的fetchResults方法。

// func.test.js
describe('when data is successfuly fetched', () => {
jest.mock('./Controller.js', () => jest.fn().mockImplementation(() => ({
fetchResults: jest.fn(() => mockResponse),
});

it('returns correct information', async () => {
expect(await func(context)).toEqual({ ...mockResponse, ...otherStuff });
});
});

下一次尝试看起来模拟在某种程度上正在工作,但返回的值是未定义而不是{ ...mockResponse, ...otherStuff }表明整个类都被模拟出来,但未找到 fetchResults,因为它是一个 static 方法而不是实例方法。

import Controller from './Controller.js'

describe('when data is successfuly fetched', () => {
Controller.mockImplementation(jest.fn(() => ({
fetchHotel: () => { ...mockResponse, ...otherStuff }
})

it('returns correct information', async () => {
expect(await func(context)).toEqual({ ...mockResponse, ...otherStuff });
});
});

最佳答案

您可以使用jest.spyOn(object, methodName)来做到这一点。

例如

controller.js:

export class Controller {
static async fetchResults(url) {
return { result: 'real result' };
}
}

func.js:

import { Controller } from './controller';

const func = async (ctx) => {
const data = await Controller.fetchResults(ctx.req.url);
// do some logic
return { ...data };
};

export { func };

func.test.js:

import { Controller } from './controller';
import { func } from './func';

describe('60776211', () => {
it('should pass', async () => {
const fetchResultsSpy = jest.spyOn(Controller, 'fetchResults').mockResolvedValueOnce({ result: 'fake data' });
const ctx = { req: { url: 'example.com' } };
const actual = await func(ctx);
expect(actual).toEqual({ result: 'fake data' });
fetchResultsSpy.mockRestore();
});
});

带有覆盖率报告的单元测试结果:

 PASS  stackoverflow/60776211/func.test.ts
60776211
✓ should pass (5ms)

---------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------|---------|----------|---------|---------|-------------------
All files | 91.67 | 100 | 75 | 88.89 |
controller.ts | 80 | 100 | 50 | 75 | 3
func.ts | 100 | 100 | 100 | 100 |
---------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.922s, estimated 11s

关于javascript - 在 Jest 中为 es6 类的静态方法创建模拟实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60776211/

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