Jestjs 通过开玩笑了解mock的实用性

Jestjs 通过开玩笑了解mock的实用性,jestjs,Jestjs,我完全不能理解嘲弄的效用。看,我有下一个模块: function Code() { this.generate = () => { const result = 'code124'; return result; }; } module.exports = Code; 现在,我想用笑话来测试它: const Code = require('../lib/code'); jest.mock('../lib/code', () => { return j

我完全不能理解嘲弄的效用。看,我有下一个模块:

function Code() {
  this.generate = () => {
    const result = 'code124';
    return result;
  };
}

module.exports = Code;
现在,我想用笑话来测试它:

const Code = require('../lib/code');

jest.mock('../lib/code', () => {
  return jest.fn().mockImplementation(() => {
    return {
      generate: () => [1, 2, 3]
    };
  });
});

describe('Code', () => {
  test('returns the code "code123"', () => {
    const code = new Code();
    expect(code.generate()).toBe('code123');
  });
});

所以。。。这个测试很好,但是。。。我的代码不是那么。。。即使我的代码是错误的,如果我可以设置一个正确的结果,那么模拟有什么意义呢?

你不应该模拟你正在测试的单元。你应该模仿它的依赖关系

例如:

每当实现中存在依赖项时:

const dependency = require('dependency');

function Code() {
  this.generate = () => {
    const result = 'code' + dependency.getNumber();
    return result;
  };
}

module.exports = Code;
您可以修改其结果,以便能够测试所有场景,而无需使用依赖项的实际实现:

const dependency = require('dependency');
const Code = require('../lib/code');
jest.mock('dependency');

describe('Code', () => {

    describe('when dependency returns 123', () => {
      beforeAll(() => {
        dependency.getNumber.mockReturnValue('123');
      });

      it('should generate code123', () => {
        const code = new Code();
        expect(code.generate()).toEqual('code123');
      });
    });

    describe('when dependency returns 124', () => {
      beforeAll(() => {
        dependency.getNumber.mockReturnValue('124');
      });

      it('should generate code123', () => {
        const code = new Code();
        expect(code.generate()).toEqual('code124');
      });
    });

});

我不知道我是否明白这个问题。通常,在测试一个模块时,最好模拟它的所有依赖项。在您的示例中,没有依赖项,因此您没有任何可模仿的内容。这对我来说更有意义。我看到的所有关于嘲弄的指南都和我做的一样,对我来说毫无意义。谢谢!