Как проверить наличие ошибок проверки модели mon goose с помощью Jest с использованием async / await? - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь проверить простую проверку модели с помощью Jest. Модель выглядит следующим образом:

const { Schema, model } = require('mongoose')
const { isEmail, isAlphanumeric, isNumeric, isAlpha } = require('validator')


const userSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    validate(v) {
      return isEmail(v)
    }
  }
})

const User = model('User', userSchema)

Затем в моем тестовом файле у меня есть следующая настройка:

const User = require("../models/user");

const invalidUser = {
  name: "David",
  email: "david@invalid"
};

const validUser = {
  name: "David",
  email: "david@example.com"
};

Теперь, когда я пытаюсь запустить тест с использованием обратных вызовов, я получаю желаемый результат (ошибка null):

test("Should not validate user without valid email", done => {
  const user = new User(invalidUser);
  user.validate(err => {
    expect(err).not.toBeNull();
    done();
  });
});

Однако, когда я реорганизую этот тест для использования async / await, он просто проходит каждый раз, даже если я изменяю invalidUser, чтобы иметь действительный электронная почта (что должно привести к сбою теста):

test("ASYNC Should not validate user without valid email", async () => {
  try {
    const user = new User(invalidUser);
    await user.validate();
  } catch (e) {
    expect(e).not.toBeNull();
  }
});

Я думаю, e неправильно заполняется ошибкой из validate(), но почему? Спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

Ваша версия asyn c неверна, так как она всегда успешно завершится sh. Примите во внимание, что:

  • Когда вы используете invalidUser, блок catch() будет вызываться с ожидаемой ошибкой, поэтому вы проверите not.toBeNull(), и все будет хорошо.
  • Когда вы используете validUser, обещание user.validate() будет выполнено без ошибок, поэтому ваш блок catch не будет выполнен, и ваш тестовый пример также успешно завершится sh.

Так что вам нужен другой подход, чтобы гарантировать, что ваш тест будет отклонен, когда обещание validate() успешно выполнено:

test("ASYNC Should not validate user without valid email", async () => {
  let error = null;
  try {
    const user = new User(invalidUser);
    await user.validate();
  } catch (e) {
    error = e;
  }
  expect(e).not.toBeNull();
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...