【问题标题】:how to test function inside another function using jest and typescript如何使用 jest 和 typescript 在另一个函数中测试函数
【发布时间】:2020-07-28 15:08:23
【问题描述】:

我必须测试 processMsg。但是,它没有被调用。以下是我尝试过的代码:

用户数据.ts

import { listen } from './rdkafka';
export class UserData {
    unsubscribe: any;
    config: any;

    constructor() {
        this.config = {
           name: 'msgHandler'
        }
    };
    private processMsg = (value): void => {
        console.log('param value', value.toString());
        this.unsubscribe();
    };
    getData = (): void => {
        this.unsubscribe = listen({
            name: this.config.name,
            processMessage: this.processMsg
        });
    };
}

test.ts

describe('UserData', () => {
    let userData: UserData;
    beforeEach(() => {
        userData = new UserData();
    });
    it('userData', () => {
        expect(userData.getData()).toBeUndefined();
    })
})

听.ts

const listen = ({name, processMessage}) => {
    const socket = new WebSocket('ws://localhost:8080');

    socket.addEventListener('message', async (data) => {
        await processMessage(data)
    });
}

getData方法测试成功,但需要测试getData里面的listen方法。在这方面的任何帮助都会非常有帮助

【问题讨论】:

  • 您能否为问题添加更多上下文?对于监听函数它从何而来?
  • 还为监听方法添加了代码。 @MehdiBelbal
  • 你不应该在你的UserData 测试中测试listen。您应该只检查是否使用正确的参数调用它。查看此链接以模拟 listen: jestjs.io/docs/en/mock-functions#mocking-modules
  • 那么在这种情况下,私有方法将永远不会测试,因为它是从监听内部调用的。那么,覆盖率将不是 100%。直接测试私有方法也不是一个好习惯,因为它与其他方法在一个流程中,如果我错了,请纠正我。 @known-as-bmf

标签: node.js typescript jestjs


【解决方案1】:

您可以使用jest.mock(moduleName, factory, options) 模拟./rdkafka 模块、listen 函数及其实现。然后根据传入listen函数的对象,就可以得到测试用例中原来的私有方法processMsg。在此之后,您可以测试processMsg 方法。下面是单元测试解决方案:

例如

userdata.ts:

import { listen } from './rdkafka';

export class UserData {
  unsubscribe: any;
  config: any;

  constructor() {
    this.config = {
      name: 'msgHandler',
    };
  }
  private processMsg = (value): void => {
    console.log('param value', value.toString());
    this.unsubscribe();
  };
  getData = (): void => {
    this.unsubscribe = listen({
      name: this.config.name,
      processMessage: this.processMsg,
    });
  };
}

rdkafka.ts:

export const listen = (opts) => {
  console.log('real implementation');
};

userdata.test.ts:

import { UserData } from './userdata';
import { listen } from './rdkafka';
import { mocked } from 'ts-jest/utils';

jest.mock('./rdkafka');

describe('63123784', () => {
  let userData: UserData;
  beforeEach(() => {
    userData = new UserData();
  });
  afterAll(() => {
    jest.resetAllMocks();
  });
  it('should pass', () => {
    expect(jest.isMockFunction(listen)).toBeTruthy();
    expect(userData.getData()).toBeUndefined();
  });
  it('should process message', () => {
    let processMessageRef;
    const mUnsubscribe = jest.fn();
    mocked(listen).mockImplementationOnce((opts) => {
      processMessageRef = opts.processMessage;
      return mUnsubscribe;
    });
    const logSpy = jest.spyOn(console, 'log');
    userData.getData();
    processMessageRef(1);
    expect(listen).toBeCalledWith({ name: 'msgHandler', processMessage: processMessageRef });
    expect(mUnsubscribe).toBeCalledTimes(1);
    expect(logSpy).toBeCalledWith('param value', '1');
  });
});

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

 PASS  stackoverflow/63123784/userdata.test.ts (9.673s)
  63123784
    ✓ should pass (3ms)
    ✓ should process message (26ms)

  console.log
    param value 1

      at CustomConsole.<anonymous> (node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866:25)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |   92.31 |      100 |      80 |   91.67 |                   
 rdkafka.ts  |      50 |      100 |       0 |      50 | 2                 
 userdata.ts |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        10.946s

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 2019-03-14
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多