javascript - 如何在 Typescript 中模拟 Cognito 响应
在定义 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
有什么办法可以避免这个错误吗?
答案#1
PromiseResult 是一个对象,它包含 .promise 作为一个函数。然后,当你想模拟一个函数以返回 PromiseResult 时,模拟数据应该是一个像 PromiseResult 一样的对象。
在你的情况下,mockData 应该是:
const mockData = {
promise: () => Promise.resolve({ Users: [] }),
} as unknown as PromiseResult<any, AWSError>;
