用Jest进行单元测试SQS receiveMessage

时间:2020-09-09 15:47:41

标签: typescript unit-testing jestjs aws-sdk aws-cli

在弄清楚如何进行单元测试时遇到了麻烦,我接近了但不能完全解决。

功能如下:

 receiveMessage(callback: Function): any {
    this.sqs.receiveMessage(
      this.params,
      (err: AWSError, data: ReceiveMessageResult) => callback(err, data)
    );
  }

在测试中,我设置了初始的AWS模拟并在测试中覆盖了它:

jest.mock('aws-sdk', () => {
  const SQSMocked = {
    receiveMessage: jest.fn().mockReturnThis()
  };
  return {
    SQS: jest.fn(() => SQSMocked),
    config: {
      update: jest.fn(() => {
        return { region: getConfig().region };
      })
    }
  };
});

const sqs = new AWS.SQS({
  region: 'us-east-1'
});

然后在此处进行实际测试。我认为在覆盖aws sdk上的receiveMessage时会出错。

  it('checks the callback is called', (done) => {
    const callback = (err: AWSError, data: ReceiveMessageResult) => {
      console.log('called');
      done();
    };

    // how to call the callback on the mock???
    sqs.receiveMessage = jest.fn().mockReturnValue(callback);

    sqsQueue.receiveMessage(callback);

    expect(callback).toHaveBeenCalled();
  });

我尝试了许多重写aws sdk的组合,大多数情况下是打字稿错误,但似乎还不太清楚如何模拟函数回调。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我更改了主要功能并提取了回调接口:

  receiveMessage(callback: SqsCallback): void {
    this.sqs.receiveMessage(this.params, callback);
  }

现在测试仅检查回调是否被调用:

  it('should call the callback', (done) => {
    const callback: SqsCallback = jest.fn(
      (err: AWSError, data: ReceiveMessageResult) => {
        done();
      }
    );
    const receiveMessageMock = jest.fn((expectedConfig, sqsCallback) => {
      return sqsCallback();
    });
    // @ts-ignore
    sqs.receiveMessage = receiveMessageMock;

    sqsQueue.receiveMessage(callback);
  });

我无法避免TS类型检查,因此不得不将ts-ignore放在模拟中。

第一次尝试很难理解这个概念,但是几天后就到达了:)