Как проверить правильность проверки данных с помощью Mocha, используя Loopback? - PullRequest
0 голосов
/ 05 июня 2019

Я настраиваю тесты для уже существующего кода.Я хочу протестировать создание записи в базе данных для объекта, в частности, как должен вести себя метод create (), когда заданы неверные параметры.При попытке создать объект с преднамеренно неправильными параметрами, метод Loopback upsert () - (который используется нашим create () - Method) выдает ошибку, прежде чем я могу утверждать поведение.

Мы используем Node, Express и Loopback для Backend и Mocha с Chai в качестве набора для тестирования.Мы используем опцию Loopback «validateUpsert: true» в модели объекта, которая предположительно приводит к возникновению вышеупомянутой ошибки.

Базовая модель выглядит примерно так:

{
  "name": "Field",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "numberOfSpots": {
      "type": "number",
      "required": true
    }
}

Так что мой тестовый пример в Mocha похож на приведенный ниже код.Обратите внимание на комментарий рядом с numberOfSpots:

it('should return null upon entering false data', async() => {
  // Given
  const givenFieldData = {
    numberOfSpots: 'two' // Using text instead of a number
  }

  // When
  const newField = await Field.create(givenFieldData);

  // Then
  assert.isNull(newField);

});

Field.create(givenFieldData) в основном вызывает этот метод Loopback после преобразования givenFieldData в Field -Object:

FieldModel.upsertWithWhere(where, Field)
    .catch(error => logger.error(error))
    .finally(return null);

Теперь я ожидаючто утверждение выполняется, но на самом деле оно никогда не выполняется.Блок finally также не выполняется.Консоль регистрирует что-то вроде этого:

ERROR (ValidationError/3844 on M): The instance `Field` is not valid. Details: `numberOfSpots` can't be blank (value: NaN).

Теперь тест не пройден, хотя поведение правильное, т.е. объект не был создан.Мне нужно найти способ проверить, не был ли объект (правильно) не создан, и это должно быть отражено при прохождении теста.Спасибо!

1 Ответ

0 голосов
/ 17 июня 2019

Field.create(givenFieldData) в основном вызывает этот метод Loopback после преобразования givenFieldData в Field -объект:

FieldModel.upsertWithWhere(where, Field)
  .catch(error => logger.error(error))
  .finally(return null);

Первая проблема заключается в вашем Field.create методе,он эффективно отбрасывает ошибки и преобразует их в результат успеха.

При возникновении ошибки обратный вызов catch выводит ее на консоль и неявно возвращает undefined.В результате внешнее обещание в конечном итоге возвращается к undefined.

Значение, возвращаемое из обратного вызова finally, всегда игнорируется.См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally.

Лично я бы не пытался обрабатывать ошибки в вашем методе create и не оставлял обработку ошибок для вызывающих.

class Field {
  create() {
    return FieldModel.upsertWithWhere(where, Field);
  }
}

Затем в тесте вы должны убедиться, чтоcreate возвращает обещание, которое в итоге отклоняется с ожидаемой ошибкой.Например, используя should.js :

it('should return null upon entering false data', async() => {
  // Given
  const givenFieldData = {
    numberOfSpots: 'two' // Using text instead of a number
  }

  Field.create(givenFieldData).should.be.rejectedWith(
    /`numberOfSpots` can't be blank/
  );
});

Если вы предпочитаете отбрасывать ошибки и возвращать null, тогда вы можете реализовать Field.create следующим образом:

class Field {
  async create() {
    try {
     return await FieldModel.upsertWithWhere(where, Field);
    } catch(err) {
      if (err.name !== 'ValidationError') {
        // re-throw non-validation errors 
        // (e.g. cannot connect to the database)
        throw err;
      }

      logger.error(error);
      return null;
    }
  }
}
...