Как написать модульный тест для моей функции, которую я использую для запроса таблицы dyanmoDB? - PullRequest
0 голосов
/ 11 мая 2018

Я использую dynogels для сканирования потерянных данных / данных зомби в моей таблице DynamoDB, ниже приведен пример.

var Foo= 
dynogels.define('Account', {
  hashKey : 'email',

  // add the timestamp attributes (updatedAt, createdAt)
  timestamps : true,

  schema : {
    email   : Joi.string().email(),
    account   : Joi.string(), ---> this account is the id in Account table
    age     : Joi.number(),
    roles   : dynogels.types.stringSet(),
    settings : {
      nickname      : Joi.string(),
      acceptedTerms : Joi.boolean().default(false)
    }
  }
});
var Account = dynogels.define('Account', {
  hashKey : 'email',

  // add the timestamp attributes (updatedAt, createdAt)
  timestamps : true,

  schema : {
    email   : Joi.string().email(),
    name    : Joi.string(),
    id     : Joi.number(),
    roles   : dynogels.types.stringSet(),
    settings : {
      nickname      : Joi.string(),
      acceptedTerms : Joi.boolean().default(false)
    }
  }
});
function scanAccount(){
  
  if(!attributeName && !FooList[attribute.id]){
     return Account.scan().execAsync();
     } 
  }

Логика заключается в том, что если в таблице Foo нет этой учетной записи, эта учетная запись является потерянной. Должен ли я написать модульный тест для этой функции? Или я должен просто написать функцию для запроса этих идентификаторов в таблице учетных записей, чтобы проверить, существуют ли они? Если я напишу модульный тест, мне все равно нужно будет запросить DynamoDB, чтобы проверить правильность значения, так как у меня более 1000+, чтобы проверить, не существует ли идентификатор этой учетной записи в таблице Foo, но я не уверен если это все еще способ сделать модульный тест?

1 Ответ

0 голосов
/ 13 мая 2018

Для ясности, написание модульных тестов для метода scanAccount будет выглядеть примерно так (в псевдокоде):

function when_attributeName_and_notFooHasAttribute_and_accountHasData_returnData() {
  // setup mock Account
  // setup scan().execAsync() on mockAccount to return some test data
  // set attributeName = 'TEST-NAME'
  // setup mock empty FooList

  // invoke scanAccount()

  // assert that you received data as expected
}

function when_notAttributeName_returnUndefined() {
  // setup mock Account
  // setup scan().execAsync() on mockAccount to return some test data
  // set attributeName = undefined
  // setup mock empty FooList

  // invoke scanAccount()

  // assert that the result is undefined
}

function when_attributeName_and_FooHasAttribute_returnUndefined() {
  // setup mock Account
  // setup scan().execAsync() on mockAccount to return some test data
  // set attributeName = 'TEST'
  // setup FooList to contain attribute.id

  // invoke scanAccount()

  // assert that the result is undefined
}

Есть смысл писать такие тесты, но не путайте юнит-тесты с интеграционными. При написании модульных тестов вы не будете проверять получение данных, просто логика вашей scanAccount реализации верна.

Кстати, я не совсем уверен, каково было намерение этого метода, но похоже, что в нем есть какие-то ошибки ... Так или иначе, просто подумать о том, какие тесты вы должны написать, может помочь вам найти ошибки. Написание тестов сделает это окончательно, и это, безусловно, поможет вам с регрессом в будущем!

...