javascript - 用 Jest 模拟 Typescript 中导入函数的返回值
问题描述
我有一个函数,我们称它为 generateName,正如您猜到的那样,它会生成一个名称。问题是每次运行测试时都会生成一个新名称。
在我的一个测试中,我断言使用包含此名称的对象调用函数。但是,名称一直在变化。我可以检查该对象是否具有属性名称,但我真的不想这样做。
我的想法是我可以模拟 generateName 函数的返回值并做这样的事情
Import { generateName } from ‘libs/generateName’
jest.fn(generateName).mockResolvedValue ( ‘hello’ )
expect ( spy ).toHaveBeenCalledWith (
expect.objectContaining ( {
name: 'houses',
} )
)
解决方案
您可以使用jest.mock(moduleName, factory, options)来模拟libs/generateName
模块。
例如
generateName.ts
:
export async function generateName() {
const name = Math.random() + '';
return name;
}
main.ts
:
import { generateName } from './generateName';
export function main() {
return generateName();
}
main.test.ts
:
import { main } from './main';
import { generateName } from './generateName';
jest.mock('./generateName', () => {
return {
generateName: jest.fn(),
};
});
describe('61350152', () => {
it('should pass', async () => {
(generateName as jest.MockedFunction<typeof generateName>).mockResolvedValueOnce('hello');
const actual = await main();
expect(actual).toBe('hello');
});
});
带有覆盖率报告的单元测试结果:
PASS stackoverflow/61350152/main.test.ts (28.524s)
61350152
✓ should pass (6ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
main.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 31.98s
推荐阅读
- dart - 为什么在方法未被覆盖时使用“协变”?
- python - 如何在基于 django 类的视图中限制对某些组的访问
- html - 在 flex-container 中获取 DIV 以正确对齐空间?
- vue.js - Vuesax路由器链接
- node.js - 有没有办法通过谷歌登录和 cookie 验证快速添加登录/注册页面,以在重新访问 webapp 后保持会话活跃?
- node.js - 如何使用 APIKey 将 Google Cloud Bigquery 与 NodeJS 连接起来
- typescript - 类型“字符串 []”上不存在属性“替换”
- python - 在 Python 中使用 Rainmeter
- javascript - 使用角度双向数据绑定角度7将字符串值绑定到复选框切换
- javascript - 将 id 从 Vue 路由器参数传递到组件的 Vuex 调度