首页 > 解决方案 > 有没有一种模拟方式可以用我的控制器测试所有发电机低级服务?

问题描述

我正在编写喷气机测试并完全支持 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'] } } });
        });
  });

标签: javascriptunit-testingamazon-dynamodbjestjs

解决方案


推荐阅读