javascript - 在 sinon 存根打字稿上返回 AWSError
问题描述
我有这个功能:
export async function checkIfUserExist(user: User): Promise<boolean> {
let result: PromiseResult<QueryOutput, AWSError>;
const params = {
TableName: "Users",
IndexName: "Email-index",
KeyConditionExpression: "Email = :user_email",
ExpressionAttributeValues: {
":user_email": user.Email
}
}
result = await dynamodb.query(params).promise();
if (result.$response.error != null) {
console.log(`Error query: ${result.$response.error}`)
return true;
} else if (result.Count > 0) {
console.log(`User already exist`)
return true;
} else {
return false;
}
}
我正在尝试使用 mocha/chai 和 Sinon 来模拟它。我试图返回一个 AWSError 来测试第一条if
语句。我的测试代码是这样的:
it('With error @ query', async () => {
const errorStub = Sinon.stub(AWS.DynamoDB.DocumentClient.prototype, 'query')
const input: User = {
Email: "pleaseneverregisteruserwiththisemail@gmail.com"
};
const expectedOutput: boolean = false;
const output = await checkIfUserExist(input);
expect(output).to.equal(expectedOutput);
expect(errorStub.calledOnce).true;
Sinon.restore();
})
如何在 errorStub 中返回 AWSError ?
解决方案
您需要存根dynamodb.query()
具有方法的方法的返回值.promise()
。之后,您还需要将.promise()
方法的已解析值存根到AWSError
.
index.ts
:
import AWS from 'aws-sdk';
const dynamodb = new AWS.DynamoDB.DocumentClient();
export async function checkIfUserExist(user): Promise<boolean> {
let result;
const params = {
TableName: 'Users',
IndexName: 'Email-index',
KeyConditionExpression: 'Email = :user_email',
ExpressionAttributeValues: {
':user_email': user.Email,
},
};
result = await dynamodb.query(params).promise();
if (result.$response.error != null) {
console.log(`Error query: ${result.$response.error}`);
return true;
} else if (result.Count > 0) {
console.log(`User already exist`);
return true;
} else {
return false;
}
}
index.test.ts
:
import AWS, { AWSError } from 'aws-sdk';
import { DocumentClient } from 'aws-sdk/clients/dynamodb';
import { expect } from 'chai';
import sinon from 'sinon';
import { checkIfUserExist } from '.';
describe('68761832', () => {
it('With error @ query', async () => {
const mReq = { promise: sinon.stub().resolves({ $response: { error: new Error('network') } }) };
const queryStub = sinon
.stub(AWS.DynamoDB.DocumentClient.prototype, 'query')
.returns((mReq as unknown) as AWS.Request<DocumentClient.QueryOutput, AWSError>);
const input = {
Email: 'pleaseneverregisteruserwiththisemail@gmail.com',
};
const output = await checkIfUserExist(input);
expect(output).to.equal(true);
expect(queryStub.calledOnce).true;
expect(mReq.promise.calledOnce).true;
sinon.restore();
});
});
测试结果:
68761832
Error query: Error: network
✓ With error @ query
1 passing (6ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 66.67 | 25 | 100 | 66.67 |
index.ts | 66.67 | 25 | 100 | 66.67 | 22-26
----------|---------|----------|---------|---------|-------------------
推荐阅读
- android - 无法在电话间隙上编译应用程序 - 新错误与贬值
- javascript - 为什么我的长十进制数在 javascript 中显示为“NaN”
- r - 如何使用日志将变量“population_in_millions”转换为以 7 为底的转换
- jetty - 如何在 geoserver 旁边添加第二个带有 jetty 的 Web 应用程序?
- ios - 创建一个精灵并给它一个自定义类
- amazon-web-services - 如何将 AWS CLI 的输出保存在变量中?
- sql - 如何获取客户数量?
- mysql - Spring Security:注册多个用户时出现 MySQL 重复条目错误
- webpack - bigcommerce 模具:尝试添加自定义 Javascript 模块 __WEBPACK_IMPORTED_MODULE_3__common_firebase__.a._log 不是函数
- java - 创建 .jks 文件以在 Eclipse 中存储密钥库