我有用于通过 IAM 身份验证连接到 AWS Rds 代理的 Connection 类。该过程的一部分是创建令牌。我有一个创建令牌的功能,但现在我很难模拟和测试它。
setToken
这是带有方法的 Connection 类:
class Connection {
constructor(username, endpoint, database) {
this.username = username;
this.endpoint = endpoint;
this.database = database;
}
setToken () {
let signer = new AWS.RDS.Signer({
region: 'us-east-1', // example: us-east-2
hostname: this.endpoint,
port: 3306,
username: this.username
});
this.token = signer.getAuthToken({
username: this.username
});
}
}
在这里我试图模拟的返回值AWS.RDS.Signer.getAuthToken()
test('Test Connection setToken', async () => {
AWSMock.setSDKInstance(AWS);
AWSMock.mock('RDS.Signer', 'getAuthToken', 'mock-token');
let conn = new connections.Connection(
'testUser',
'testEndpoint',
'testDb');
conn.setToken();
console.log(conn.token);
});
我希望将“mock-token”视为 的值conn.token
,但我得到的是:
{
promise: [Function],
createReadStream: [Function: createReadStream],
on: [Function: on],
send: [Function: send]
}
我怎样才能AWS.RDS.Signer.getAuthToken()
返回一个模拟令牌?
尝试@ggordon 的解决方案后进行编辑
我试图通过注入AWS
构造函数来让它工作,但似乎仍然有同样的问题。我认为我的部分问题是 AWS.RDS.Signer 不支持承诺,但我不完全确定。
这是我的新代码:
Token
生成令牌的类。从“aws-sdk”导入 AWS;
class Token {
constructor(awsInstance) {
this.awsInstance = awsInstance || AWS;
}
getToken () {
const endpoint = 'aurora-proxy.proxy.rds.amazonaws.com';
const signer = new this.awsInstance.RDS.Signer({
region: 'my-region',
hostname: endpoint,
port: 3306,
username: 'myUser'
});
const token = signer.getAuthToken({
username: 'svcLambda'
});
console.log ("IAM Token obtained\n");
return token
}
}
module.exports = { Token };
和测试:
test('Should test getToken from Token', async () => {
AWSMock.setSDKInstance(AWS);
AWSMock.mock('RDS.Signer', 'getAuthToken', 'mock-token');
let tokenObject = new tokens.Token(AWS);
const token = tokenObject.getToken();
console.log(token);
expect(token).toStrictEqual('mock-token');
});
Token 类本身可以工作——它创建令牌,并且令牌可用于成功连接到 RDS。但是,单元测试失败,返回的实际令牌(来自 console.log)是这样的:
{
promise: [Function],
createReadStream: [Function: createReadStream],
on: [Function: on],
send: [Function: send]
}
这也是package.json
@GSSWain 要求的
{
"name": "mylambda",
"version": "0.0.1",
"description": "My description.",
"repository": {
"type": "git",
"url": ""
},
"scripts": {
"lint": "eslint src/**/*.js __tests__/**/*.js",
"prettier": "prettier --write src/**/*.js __tests__/**/*.js",
"prettier:ci": "prettier --list-different src/**/*.js __tests__/**/*.js",
"test": "cross-env NODE_ENV=test jest",
"test:coverage": "cross-env CI=true jest --coverage --watchAll=false -u --reporter=default --reporters=jest-junit",
"build": "npm run build:dev",
"build:dev": "cross-env NODE_ENV=development webpack --config webpack.config.js"
},
"dependencies": {
"mysql2": "^2.2.5"
},
"devDependencies": {
"@babel/core": "^7.6.4",
"@babel/preset-env": "^7.6.3",
"aws-sdk": "^2.552.0",
"aws-sdk-mock": "^5.1.0",
"babel-jest": "^24.9.0",
"babel-loader": "^8.0.6",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"cross-env": "^6.0.3",
"eslint": "^6.5.1",
"eslint-config-prettier": "^6.4.0",
"eslint-plugin-jest": "^22.19.0",
"jest": "^24.9.0",
"jest-junit": "^10.0.0",
"prettier": "^1.18.2",
"sinon": "^9.0.3"
},
"jest": {
"verbose": true,
"transform": {
"^.+\\.js$": "babel-jest"
},
"globals": {
"NODE_ENV": "test"
},
"moduleFileExtensions": [
"js"
],
"moduleDirectories": [
"node_modules",
"src"
],
"coverageThreshold": {
"global": {
"statements": 100,
"branches": 100,
"functions": 100,
"lines": 100
}
}
},
"jest-junit": {
"outputName": "junit_jest.xml"
}
}