代码之家  ›  专栏  ›  技术社区  ›  Bruno Brant

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

  •  0
  • Bruno Brant  · 技术社区  · 5 年前

    我正试图重新塑造自己,使用笑话,我发现从sinon迁移到它有点困难。

    sinon.createStubInstance sinon会给我这个类的一个存根实例,它是一个对象实例,所有方法都是存根。

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

    有更好的办法吗?Jest有没有类似的方法 createStubInstance 来自西农?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Lin Du Correcter    5 年前

    你可以用 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 使用类的所有存根方法创建存根实例。

    索引 :

    查找(){
    console.log('find');
    }
    log('findById');
    }
    }
    

    :

    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