Есть ли способ шутить, чтобы проверить все динамо-сервисы низкого уровня с моими контроллерами? - PullRequest
0 голосов
/ 26 апреля 2019

Я пишу струйные тесты и полностью поддерживаю модульный тест для приложения Dynamo Express.Есть ли хороший пример того, как имитирует динамо из зависимостей моего контроллера, что он возвращает тот же ответ и проверяет тип входных данных на API низкого уровня DynamoDB через следующие атрибуты функций: get, query, batchGet, batchWrite, а также какие данные должны бытьпо сравнению.Структура макета должна вести себя следующим образом: controller -> db services -> json -> wrapper и, таким образом, сможет начинать утверждать каждый случай.

Я пробовал 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'] } } });
        });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...