javascript - 有没有一种模拟方式可以用我的控制器测试所有发电机低级服务?
问题描述
我正在编写喷气机测试并完全支持 dynamo express 应用程序的单元测试。有没有一个很好的例子,如何从我的控制器依赖项中模拟 dynamo,它返回相同的响应并通过以下函数属性验证 dynamoDB 低级 api 的输入数据类型:get、query、batchGet、batchWrite 以及需要哪些数据比较的。模拟结构的行为如下:控制器 -> 数据库服务 -> json -> 包装器,因此能够开始断言每个案例。
我尝试了 aws-sdk-mock 但没有成功。下面是我的代码片段:
function getRecordIdsFromDynamo(message) {
return new Promise((resolve, reject) => {
let is = message.id;
let params = {
Key: { id: id },
TableName: LOOKUP,
ConsistentRead: true,
ProjectionExpression: 'activeRecord'
}
dynamoClient.get(params, function(err, data) {
try {
let activeRecords = [];
if(data.Item.activeRecord)
activeRecords = data.Item.activeRecord.values;
resolve(activeRecords);
} catch(){}
})
})
}
function getRecordsFromDynamo(keys, id) {
return new Promise((resolve, reject) => {
let results = [];
let params = { RequestItems: {} };
if(keys.length == 0)
return resolve(results);
// unprocessed logic...
dynamoClient.batchGet(params, function(err, data) {
// err logic...
const responses = data.Responses[RECORD],
newUnprocessedKeys = data.UnprocessedKeys[RECORD];
results = results.concat(responses);
resolve(results)
})
})
}
exports.getRecords = function(message) {
return new Promise((resolve, reject) => {
getRecordsIdsFromDynamo(message)
.then((records) => {
let keys = records.map((id) => {
return { RecordId: id }
});
getRecordsFromDynamo(keys, message.id)
.then((records) => {})
.catch((err) => {
reject(err);
});
});
}
// test code
exports.getActiveRecordIds = async (message, docClient) => {
let data = await getActiveRecordsIdsfromDB(message, docClient);
console.log("data.Items =========>", data.Items);
return {
"Items": {
activeRecordIds: {
values: data.Items
}
}
}
};
/**
*
* @param {String} messageDevice
* @param {AWS} docClient
* @returns {Promise<object>} return promise with activeRuleIds
*/
function getActiveRecordsIdsfromDB(message, docClient) {
const activeRecords = db.getRecords(message);
console.log("In getActiveRecordsIdsFromDB " + activeRecords);
const params = {
Key: { id: message.id },
TableName: LOOKUP,
ConsistentRead: true,
ProjectionExpression: 'activeRecordIds'
};
return docClient.get(params).promise();
};
beforeEach(() => {
// Clear all instances and calls to constructor and all methods:
Message.mockClear();
event = record.event;
recordId = record.id;
ts = record.ts;
context = '1357';
message = new Message({
id: id,
ts: ts,
event: event
}, context);
});
it('should get all active records from dynamo', () => {
AWS_mock.mock('DynamoDB.DocumentClient', 'get', function(params, callback) {
callback(null, { Items: ['1234', '4321'] });
});
let docClient = new aws.DynamoDB.DocumentClient();
return getActiveRecordsIds(message, docClient)
.then(recordIds => {
expect(recordIds).toEqual({ Items: { activeRecordsIds: { values: ['1234', '4321'] } } });
});
});
解决方案
推荐阅读
- java - 有竞争力的程序员在 Java 中使用什么类型的控制台 println?
- objective-c - 在 Swift 中实现一个 Objective-C 协议
- python - 程序执行多次但没有正确更新日志文件
- reactjs - 如何在 React 和 typescript 的样式属性中定义 css 变量
- cumulocity - 托管微服务,SpringSecurityContextProvider:安全上下文不可用
- pattern-matching - '是之间的区别
' 和 '== 常数' - php - 在 PHP 中内部连接到 mongoDB
- javascript - 如何拆分这个复杂的字符串
- javascript - JavaScript addEventListener 到隐藏元素
- java - 如何在播放框架中使用按钮(字形图标)上的图标