sli*_*wp2 6 javascript typescript jestjs
我使用ts-jest和jest用Typescript编写测试文件。
我很困惑如何键入模块的模拟功能。
这是我的代码:
./module.ts:
import {IObj} from '../interfaces';
const obj: IObj = {
getMessage() {
return `Her name is ${this.genName()}, age is ${this.getAge()}`;
},
genName() {
return 'novaline';
},
getAge() {
return 26;
}
};
export default obj;
Run Code Online (Sandbox Code Playgroud)
./module.test.ts:
import * as m from './module';
describe('mock function test suites', () => {
it('t-1', () => {
// I think the jest.Mock<string> type here is not correct.
m.genName: jest.Mock<string> = jest.fn(() => 'emilie');
expect(jest.isMockFunction(m.genName)).toBeTruthy();
expect(m.genName()).toBe('emilie');
expect(m.getMessage()).toEqual('Her name is emilie, age is 26');
expect(m.genName).toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
如何输入genName模块的模拟功能m?
typescript 给我一个错误在这里:
错误:(8,7)TS2540:无法分配给'genName',因为它是常量或只读属性。
小智 11
这就是我如何解决同样的问题以及我现在如何进行所有嘲笑和监视。
import * as m from './module';
describe('your test', () => {
let mockGenName;
beforeEach(() => {
mockGenName = jest.spyOn(m,
'genName').mockImplemetation(() => 'franc');
})
afterEach(() => {
mockGenName.mockRestore();
})
test('your test description', () => {
// do something that calls the genName function
expect(mockGenName).toHaveBeenCalledTimes(1);
})
})
Run Code Online (Sandbox Code Playgroud)
通过此设置,您可以以编程方式更改不同测试的模拟实现,然后断言该函数被调用以及调用的内容,同时在测试之间和所有测试之后清除模拟。
您想要模拟该模块,然后更改其中的导出函数。这应该取代您的导入声明。
jest.mock('./module', () => ({
genName: jest.fn().mockImplementation(() => 'emilie')
}))
Run Code Online (Sandbox Code Playgroud)