【问题标题】:How to mock a method inside a method using JEST?如何使用 JEST 在方法中模拟方法?
【发布时间】:2020-03-31 02:49:54
【问题描述】:

我正在尝试对一个名为search 的方法进行单元测试,该方法具有buildSearchParameterisUnknownFieldsreadAll 等三种方法。我需要嘲笑他们,但我不知道该怎么做。谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript node.js typescript unit-testing jestjs


    【解决方案1】:

    为了简化问题,我删除了它的静态类型。您可以使用jest.spyOn 为这三种方法制作存根。这是单元测试解决方案:

    index.ts:

    import ModelUtility from './ModelUtility';
    
    enum EndpointType {
      SEARCH = 'SEARCH',
    }
    
    export class SomeClass {
      schemaConstants;
      errorConstants = {
        invalidQueryParameters: 'invalid',
      };
    
      search = async (query, endpointConstants) => {
        const searchParam = ModelUtility.buildSearchParameter(query, endpointConstants, this.schemaConstants);
        // check for unknown fields
        const isUnknownFields = ModelUtility.isUnknownFields(EndpointType.SEARCH, searchParam, this.schemaConstants);
        if (isUnknownFields) {
          return this.errorConstants.invalidQueryParameters;
        }
        return this.readAll(query, searchParam, endpointConstants);
      };
    
      readAll(...args) {
        return 'real data';
      }
    }
    

    ModelUtility.ts:

    export default {
      buildSearchParameter(...args) {
        return 'real search parameter';
      },
      isUnknownFields(...args) {
        return true;
      },
    };
    

    index.spec.ts:

    import { SomeClass } from './';
    import ModelUtility from './ModelUtility';
    
    describe('SomeClass', () => {
      afterEach(() => {
        jest.restoreAllMocks();
      });
      it('should return invalid query parameters', async () => {
        const buildSearchParameterSpy = jest
          .spyOn(ModelUtility, 'buildSearchParameter')
          .mockReturnValueOnce('mocked search parameter');
        const isUnknownFieldsSpy = jest.spyOn(ModelUtility, 'isUnknownFields').mockReturnValueOnce(true);
    
        const instance = new SomeClass();
        const actual = await instance.search('mocked query', 'endpointConstants');
        expect(actual).toBe('invalid');
        expect(buildSearchParameterSpy).toBeCalledWith('mocked query', 'endpointConstants', undefined);
        expect(isUnknownFieldsSpy).toBeCalledWith('SEARCH', 'mocked search parameter', undefined);
      });
    
      it('should return correctly', async () => {
        const buildSearchParameterSpy = jest
          .spyOn(ModelUtility, 'buildSearchParameter')
          .mockReturnValueOnce('mocked search parameter');
        const isUnknownFieldsSpy = jest.spyOn(ModelUtility, 'isUnknownFields').mockReturnValueOnce(false);
    
        const instance = new SomeClass();
        jest.spyOn(instance, 'readAll').mockReturnValueOnce('mocked data');
        const actual = await instance.search('mocked query', 'endpointConstants');
        expect(actual).toBe('mocked data');
        expect(buildSearchParameterSpy).toBeCalledWith('mocked query', 'endpointConstants', undefined);
        expect(isUnknownFieldsSpy).toBeCalledWith('SEARCH', 'mocked search parameter', undefined);
      });
    });
    

    带有覆盖率报告的单元测试结果:

     PASS  src/stackoverflow/59207566/index.spec.ts
      SomeClass
        ✓ should return invalid query parameters (7ms)
        ✓ should return correctly (1ms)
    
    -----------------|----------|----------|----------|----------|-------------------|
    File             |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
    -----------------|----------|----------|----------|----------|-------------------|
    All files        |    72.73 |      100 |    57.14 |    73.68 |                   |
     ModelUtility.ts |       20 |      100 |        0 |       20 |           2,3,5,6 |
     index.ts        |    88.24 |      100 |       80 |    92.86 |                24 |
    -----------------|----------|----------|----------|----------|-------------------|
    Test Suites: 1 passed, 1 total
    Tests:       2 passed, 2 total
    Snapshots:   0 total
    Time:        4.891s, estimated 11s
    

    【讨论】:

      猜你喜欢
      • 2023-02-15
      • 2016-11-07
      • 2019-02-02
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      相关资源
      最近更新 更多