如何解决您如何在打字稿中的类型化测试假冒中使用笑话模拟?
我有一个接口,该接口定义实现它的对象应具有某些功能。例如:
interface MyInterface {
someFunc: () => void,/* ... other bits and bobs */
}
我想编写一个测试,以在某些情况下调用其中一个函数。
我有一个使用伪造品的测试,看起来像这样:
const obj: MyInterface = {
...fakeObj,someFunc: jest.fn(() => {})
};
/* ... the actual test code */
expect(obj.someFunc.mock.calls.length).toBe(1);
在我为obj
变量赋予显式类型之前,此是起作用。但是,现在它会产生错误:
类型'()=> void'上不存在属性'mock'。
我想在对象中添加类型,因为我希望能够使用重构工具而不必手动修复所有测试。
在使用显式类型时,如何编写测试对象上调用函数的测试?
解决方法
最简单的方法是使用mocked测试助手。
模拟测试帮助程序根据其源代码的类型提供模拟模块甚至其深层方法的类型。它利用了最新的TypeScript功能,因此您甚至可以在IDE中完成参数类型(与jest.MockInstance相对)。
例如
index.ts
:
export interface MyInterface {
someFunc: () => void;
}
export function main(obj: MyInterface) {
return obj.someFunc();
}
index.test.ts
:
import { main,MyInterface } from './';
import { mocked } from 'ts-jest/utils';
describe('63478184',() => {
it('should pass',() => {
const obj: MyInterface = {
someFunc: jest.fn().mockReturnValueOnce('mocked value'),};
main(obj);
expect(mocked(obj.someFunc).mock.calls.length).toBe(1);
});
});
具有覆盖率报告的单元测试结果:
PASS src/stackoverflow/63478184/index.test.ts (12.902s)
63478184
✓ should pass (8ms)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.ts | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed,1 total
Tests: 1 passed,1 total
Snapshots: 0 total
Time: 14.759s
源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/63478184
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。