javascript - 如何在 Typescript 中模拟 Cognito 响应

标签 javascript node.js typescript amazon-web-services serverless

定义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');

  })

})

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 作为函数的对象。然后,当您想要模拟函数以返回 PromiseResult 时,模拟数据应该是像 PromiseResult 这样的对象。

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

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

关于javascript - 如何在 Typescript 中模拟 Cognito 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67929129/

相关文章:

angular - 即使绑定(bind)有效,也无法读取未定义错误的属性

javascript - 是否可以在没有异步/等待的情况下从 promise 返回已解析的值?

node.js - pm2 restart 和 pm2 reload 有什么区别

javascript - 如何禁用所有 typescript 类型检查?

javascript - 为什么我不能检查环境变量是否未定义?

node.js - Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止

java - Ext.draw.sprite事件未触发

javascript - 如何读取和显示 JSON

javascript - 将数据从 Node.js 发送回客户端?

php - 共享服务器用户上传进度条的最佳解决方案