我试图重组自己以使用Jest,但发现从sinon迁移到它有些困难。
使用sinonjs,如果我有一个类,我可以做sinon.createStubInstance
,而sinon会给我该类的存根实例,这是所有方法都存根的对象实例。
开玩笑,在网上搜索了很多遍之后,看来我要么需要使用__mocks__
文件夹抽象并重新输入整个类,要么单独对方法进行存根。
有更好的方法吗? Jest是否有与sinon中的createStubInstance
类似的任何方法?
答案 0 :(得分:0)
您可以使用jest.doMock()在单个单元测试用例中对带有笑话的类的所有方法进行存根。
例如
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