如何用 Jest 存根一个类的所有方法?



我正在尝试重新构建自己以使用Jest,但我发现从sinon 迁移到它有点困难。

使用 sinonjs,如果我有一个类,我可以做sinon.createStubInstancesinon 会给我一个该类的存根实例,这是一个对象实例,其中所有方法都是存根。

开玩笑,在多次搜索网络之后,似乎我要么需要使用__mocks__文件夹抽象并重新键入整个类,要么单独存根方法。

有没有更好的方法?开玩笑有什么方法类似于西农的createStubInstance吗?

您可以使用 jest.doMock() 在单个单元测试用例中使用 jest 存根类的所有方法。

例如

index.ts

export class SomeClass {
find() {
console.log('find');
}
findById(id) {
console.log('findById');
}
}

.find().findById的真正实现称为console.log。 现在,我们使用jest.doMock来存根它们。

index.spec.ts

describe('57649917', () => {
it('should mock all methods of SomeClass', () => {
jest.doMock('./');
const { SomeClass } = require('./');
const logSpy = jest.spyOn(console, 'log');
const mInstance = new SomeClass();
expect(jest.isMockFunction(mInstance.find)).toBeTruthy();
expect(jest.isMockFunction(mInstance.findById)).toBeTruthy();
mInstance.find();
mInstance.findById(1);
expect(mInstance.find).toBeCalledTimes(1);
expect(mInstance.findById).toBeCalledTimes(1);
expect(logSpy).not.toBeCalled();
});
it('should call the real methods of SomeClass', () => {
jest.unmock('./');
const logSpy = jest.spyOn(console, 'log');
const { SomeClass } = require('./');
const instance = new SomeClass();
instance.find();
instance.findById(1);
expect(logSpy.mock.calls[0]).toEqual(['find']);
expect(logSpy.mock.calls[1]).toEqual(['findById']);
});
});

单元测试结果:

PASS  src/stackoverflow/57649917/index.spec.ts (8s)
57649917
✓ should mock all methods of SomeClass (9ms)
✓ should call the real methods of SomeClass (9ms)
console.log node_modules/jest-mock/build/index.js:860
find
console.log node_modules/jest-mock/build/index.js:860
findById
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        9.182s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/57649917

对于sinon.js,我们可以使用sinon.createStubInstance创建一个包含类的所有存根方法的存根实例。

index.ts

export class SomeClass {
find() {
console.log('find');
}
findById(id) {
console.log('findById');
}
}

index.spec.ts

import { SomeClass } from './';
import sinon from 'sinon';
import { expect } from 'chai';
describe('57649917', () => {
it('should stub all methods of SomeClass', () => {
const stubInstance = sinon.createStubInstance(SomeClass);
stubInstance.find();
stubInstance.findById(1);
expect(stubInstance.find.calledOnce).to.be.true;
expect(stubInstance.findById.calledWith(1)).to.be.true;
});
});

单元测试结果:

57649917
✓ should stub all methods of SomeClass

1 passing (13ms)

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/57649917

相关内容

最新更新