Асинхронно перехватывает сложные ошибки Mon goose с помощью Chai.throw - PullRequest
0 голосов
/ 20 апреля 2020

Chai.throw используется для проверки простых ошибок на их message проп. В простых случаях ошибки это работает нормально.

it.only('Should catch a thrown message', () => {
    function throwSomething() {
      throw new Error('something')
    }

    expect(throwSomething).to.throw('something')
})

Однако, при асинхронном тестировании на сбой проверки Mon goose я вижу, что не могу получить доступ к вложенному сообщению об ошибке. Изначально я хотел использовать asyn c тесты с try + catch, но вызов expect внутри блока catch не гарантированно выполняется, и в этом случае тест может пройти, если на самом деле не произошла ошибка.

it.only('Errors on save if username is not unique', async () => {
    // setup original user
    const original = new UserModel(testParams)
    await original.save()

    try {

      // try to create a new user with the same username
      const duplicate = new UserModel({
        username: testParams.username,
        email: 'test_other@mail.com',
        password: testParams.password
      })

      // save the user that has a non-unique username
      await duplicate.save()
    } catch (err) {

      // confirm the nested error was as expected
      expect(err.errors.username.message).to.equal(
        'Error, expected `username` to be unique. Value: ' +
        '`' + testParams.username + '`'
      )
    }
})

Если бы я позвонил expect(duplicate.save).to.throw('...'), это не проверяло бы нужное мне поле ошибки.

Другой вариант заключается в том, что вместо асинхронного тестирования моих моделей я использую обратные вызовы Promise и вызываю done() внутри обратного вызова .catch(). Однако я нахожу этот метод нежелательным, если я тестирую много вложенных операций Promise.

Есть ли способ использовать Chai.throw для отлова сложных вложенных ошибок, производимых Mon goose?

...