【问题标题】:How to mock Cognito response in Typescript如何在 Typescript 中模拟 Cognito 响应
【发布时间】:2021-08-27 22:22:46
【问题描述】:

定义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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 2015-06-26
      • 2016-05-10
      • 2018-06-26
      • 2020-12-10
      相关资源
      最近更新 更多