如何在 Typescript 中模拟 Cognito 响应

How to mock Cognito response in Typescript

定义 class CognitoPool 后将其保存为 cognitoPool.ts 脚本:

const AWS = require('aws-sdk');
import { CognitoIdentityServiceProvider } from 'aws-sdk';
import {ListUsersRequest, ListUsersResponse} from 'aws-sdk/clients/cognitoidentityserviceprovider';

export class CognitoPool {
  private identityService: CognitoIdentityServiceProvider;

  constructor(identityService: CognitoIdentityServiceProvider) {    
    this.identityService = identityService;
  }

  async listCognitoUsers(poolID: string, sub: string): Promise<ListUsersResponse> {

    let params = {
      UserPoolId: poolID,
      Filter: `sub="${sub}"`
    } as ListUsersRequest;

    let res: ListUsersResponse = await this.identityService.listUsers(params).promise();
    return res;
  }
}

export default new CognitoPool(new AWS.CognitoIdentityServiceProvider());

我继续写测试脚本:

const AWS = require('aws-sdk');
import sinon, { stubObject } from 'ts-sinon'
import { CognitoIdentityServiceProvider, AWSError } from 'aws-sdk';
import { PromiseResult } from 'aws-sdk/lib/request';
import { CognitoPool } from './cognitoPool';


describe('Testing', () => {

  const identityService = new AWS.CognitoIdentityServiceProvider();

  const stub = stubObject(identityService);

  const cognitoPool = new CognitoPool(stub);

  it('Test 01', async () => {

    let mockData = {
      Users: []
    } as unknown as PromiseResult<any, AWSError>;
    
    stub.listUsers.returns(mockData); 

    let result = await cognitoPool.listCognitoUsers('poolId-123', 'sub-123');

  })

})

A mockData 将由 identityService.listUsers() 作为 as PromiseResult:

返回
    let mockData = {
      Users: []
    } as unknown as PromiseResult<any, AWSError>;

但是测试脚本运行出错:

TypeError: this.identityService.listUsers(...).promise is not a function

有没有办法避免这个错误?

PromiseResult 是一个包含 .promise 作为函数的对象。然后,当你想模拟一个函数到 return 一个 PromiseResult 时,模拟数据应该是一个像 PromiseResult.

这样的对象

在您的情况下,mockData 应该是:

const mockData = {
  promise: () => Promise.resolve({ Users: [] }),
} as unknown as PromiseResult<any, AWSError>;