使用 Jest 模拟 Typescript 中导入函数的返回值

oll*_*e y 3 javascript testing unit-testing typescript jestjs

我有一个函数,我们称之为generateName,正如你\xe2\x80\x99 所猜到的那样,它会生成一个名称。问题是每次运行测试时都会生成一个新名称。

\n\n

在我的一项测试中,我断言使用包含此名称的对象调用函数。然而,这个名字一直在变化。我可以只检查该对象是否具有属性名称,但我真的不想这样做。

\n\n

我的想法是我可以模拟generateName函数的返回值并执行类似的操作

\n\n
Import { generateName } from \xe2\x80\x98libs/generateName\xe2\x80\x99\n\njest.fn(generateName).mockResolvedValue ( \xe2\x80\x98hello\xe2\x80\x99 )\n\nexpect ( spy ).toHaveBeenCalledWith ( \n      expect.objectContaining ( {\n        name: 'houses',\n      } )\n)\n
Run Code Online (Sandbox Code Playgroud)\n

sli*_*wp2 5

您可以使用jest.mock(moduleName,factory,options)来模拟libs/generateName模块。

\n\n

例如\ngenerateName.ts

\n\n
export async function generateName() {\n  const name = Math.random() + \'\';\n  return name;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

main.ts:

\n\n
import { generateName } from \'./generateName\';\n\nexport function main() {\n  return generateName();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

main.test.ts:

\n\n
import { main } from \'./main\';\nimport { generateName } from \'./generateName\';\n\njest.mock(\'./generateName\', () => {\n  return {\n    generateName: jest.fn(),\n  };\n});\n\ndescribe(\'61350152\', () => {\n  it(\'should pass\', async () => {\n    (generateName as jest.MockedFunction<typeof generateName>).mockResolvedValueOnce(\'hello\');\n    const actual = await main();\n    expect(actual).toBe(\'hello\');\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
 PASS  stackoverflow/61350152/main.test.ts (28.524s)\n  61350152\n    \xe2\x9c\x93 should pass (6ms)\n\n----------|---------|----------|---------|---------|-------------------\nFile      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n----------|---------|----------|---------|---------|-------------------\nAll files |     100 |      100 |     100 |     100 |                   \n main.ts  |     100 |      100 |     100 |     100 |                   \n----------|---------|----------|---------|---------|-------------------\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        31.98s\n
Run Code Online (Sandbox Code Playgroud)\n