gpt4 book ai didi

typescript - 使用 TypeScript 使用 Jest 测试或模拟未导出的函数

转载 作者:行者123 更新时间:2023-12-03 16:24:03 26 4
gpt4 key购买 nike

有没有办法使用 TypeScript 用 Jest 测试未导出的函数?我已经看到推荐一些库的 SO 答案,例如 rewire但似乎它们还不是真正的 TypeScript 兼容。另一种方法是导出这些私有(private)函数,但我认为必须有一个解决方案,而不是仅仅为了测试目的而导出。

设置如下。有两个功能,一个是导出的,一个不是。

export function publicFunction() {
privateFunction();
}

function privateFunction() {
// Whatever it does
}

在我的单元测试中,我希望解决两种情况。测试 privateFunction本身并为 publicFunction mock 它测试。

我正在使用 开 Jest 在测试时编译 typescript 文件。 jest.config.json 好像

{
"transform": {
"^.+\\.(t|j)sx?$": "ts-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(tsx?)$",
"moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"],
"testEnvironment": "node",
"globals": {
"ts-jest": {
"tsConfig": "test/tsconfig.spec.json"
}
}
}

我熟悉 jest.fn()但我不知道如何覆盖或提取私有(private)函数。单元测试类似于

import { publicFunction } from '../src';

describe('publicFunction', () => {
it('should call "privateFunction" once', () => {
// Overwrite privateFunction with jest.fn();

publicFunction();

expect(...).toHaveBeenCalled(1);
});
});

或者测试无法导入的私有(private)函数。
import { privateFunction } from '../src/index'

describe('privateFunction', () => {
it(...
});

有什么想法或建议吗?谢谢!

最佳答案

为了使用 JEST 和 Typescript 测试非导出函数,我使用了 Rewire。几乎没有问题,我们必须提供重新连接 TS 构建文件夹的路径,而不是 .ts 文件路径。

以下是我的目录结构:

app
|---dist
|---controllers
|---api.js
src
|---controllers
|---api.ts
|---api.spec.ts

因此,对于重新布线,我必须提供 ./dist/controllers/api 的路径而不是 ./src/controllers/api
这是我的示例代码:
import rewire from "rewire";

const api = rewire('../../dist/controllers/api'); // path to TS build folder

describe("API Controller", () => {
describe('Fetch Route Params', () => {

let fetchRouteParams: (url: string) => string;

beforeEach(() => {
fetchRouteParams = api.__get__('fetchRouteParams'); // non-exported function
});

it('should fetch route params from url', () => {
const url = "https://example.com/foo/api/products";
expect(fetchRouteParams(url)).toEqual('foo/api/products');
});

it('should not fetch route params from url', () => {
const url = "";
expect(fetchRouteParams(url)).toEqual('');
});
});
});

除了使用 rewire 之外,即使我也没有遇到更好的解决方案。 .但它适用于测试非导出函数。

我使用过的 NPM 包:
npm i -D rewire
npm i -D @types/rewire

希望对您有所帮助,谢谢。

关于typescript - 使用 TypeScript 使用 Jest 测试或模拟未导出的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54697062/

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