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