Mar*_*com 3 mocking typescript jestjs
我有以下要在Jest中测试的打字稿类。
//MyClass.ts
import { foo } from './somewhere/FooFactory';
export class MyClass {
private _state : number;
constructor( arg : string ) {
this._state = foo( arg );
}
public getState() : string {
return this._state;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试:
//MyClass.spec.ts
import { MyClass } from './MyClass';
describe( 'test MyClass', () => {
test( 'construct' => {
const c = new MyClass( 'test' );
expect( c ).toBeDefined();
expect( c.getState() ).toEqual( 'TEST' );
} );
} );
Run Code Online (Sandbox Code Playgroud)
如何模拟MyClass中使用的foo函数,以便此测试通过?
有几种不同的处理方法。
您只能foo使用jest.spyOn和模拟,例如mockImplementation:
import { MyClass } from './MyClass';
import * as FooFactory from './somewhere/FooFactory';
describe('test MyClass', () => {
test('construct', () => {
const mock = jest.spyOn(FooFactory, 'foo'); // spy on foo
mock.mockImplementation((arg: string) => 'TEST'); // replace implementation
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
mock.mockRestore(); // restore original implementation
});
});
Run Code Online (Sandbox Code Playgroud)
同样的,你可以自动模拟FooFactory用jest.mock,然后提供一个实现foo:
import { MyClass } from './MyClass';
import * as FooFactory from './somewhere/FooFactory';
jest.mock('./somewhere/FooFactory'); // auto-mock FooFactory
describe('test MyClass', () => {
test('construct', () => {
const mockFooFactory = FooFactory as jest.Mocked<typeof FooFactory>; // get correct type for mocked FooFactory
mockFooFactory.foo.mockImplementation(() => 'TEST'); // provide implementation for foo
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
});
});
Run Code Online (Sandbox Code Playgroud)
您还可以FooFactory使用传递给的模块工厂进行模拟jest.mock:
import { MyClass } from './MyClass';
jest.mock('./somewhere/FooFactory', () => ({
foo: () => 'TEST'
}));
describe('test MyClass', () => {
test('construct', () => {
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
});
});
Run Code Online (Sandbox Code Playgroud)
最后,如果您打算在多个测试文件中使用相同的模拟,则可以通过在以下位置创建模拟来模拟用户模块./somewhere/__mocks__/FooFactory.ts:
export function foo(arg: string) {
return 'TEST';
}
Run Code Online (Sandbox Code Playgroud)
...然后调用jest.mock('./somewhere/FooFactory');在测试中使用模拟:
import { MyClass } from './MyClass';
jest.mock('./somewhere/FooFactory'); // use the mock
describe('test MyClass', () => {
test('construct', () => {
const c = new MyClass('test');
expect(c).toBeDefined();
expect(c.getState()).toEqual('TEST'); // SUCCESS
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1951 次 |
| 最近记录: |