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

时间:2019-08-25 21:37:23

标签: javascript jestjs sinon

我试图重组自己以使用Jest,但发现从sinon迁移到它有些困难。

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

开玩笑,在网上搜索了很多遍之后,看来我要么需要使用__mocks__文件夹抽象并重新输入整个类,要么单独对方法进行存根。

有更好的方法吗? Jest是否有与sinon中的createStubInstance类似的任何方法?

1 个答案:

答案 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