Подтвердить что ты не робот

Испытайте отказ с Чаем, как и обещали

Я хочу проверить функцию, возвращающую обещание.

В этом конкретном тесте ожидается, что обещание будет отклонено с объектом Error, содержащим классическое поле message (в этом тесте он должен быть равен "my error message") и настраиваемое поле, которое я добавил с именем code, который является строкой (например, "EACCESS", "ERIGHT" и т.д., в этом тесте ожидается, что она будет равна "EFOO")

Я хочу использовать chai-as-обещанный для этого.

return expect(foo()).to.eventually.be.rejectedWith("my error message");

Это утверждение работает, но теперь я также хочу проверить поле code.
Как это сделать?

4b9b3361

Ответ 1

Если вы используете Chai-As-Promised (как вы говорите, это), то это позволяет отключить rejectedWith - и он устанавливает объект утверждения цепи как объект ошибки - что-то означающее после того, как rejectedWith() теперь собирается утверждать об ошибке. Это позволяет вам делать такие классные вещи, как:

return expect(foo()).to.eventually
  .be.rejectedWith("my error message")
  .and.be.an.instanceOf(Error)
  .and.have.property('code', 'EFOO');

Некоторые из chai-методов также цепочки, поэтому вы можете использовать это, чтобы сделать довольно глубоко вложенные утверждения об ошибке:

return expect(foo()).to.eventually
  .be.rejectedWith("my error message")
  .and.have.property('stack')
    .that.includes('myfile.js:30')

Ответ 2

Имея версию 5.1.0 ChaiAsPromised, решение от Keithamus не сработало для меня - rejectWith не дал мне объект ошибки для утверждения, но "отклонил" сделал:

return expect(foo())
    .to.be.rejected
    .and.be.an.instanceOf(Error)
    .and.have.property('code', 'EFOO');

Для утверждения нескольких свойств

return expect(foo())
    .to.be.rejected
    .then(function(error) {
        expect(error).to.have.property('name', 'my error message');
        expect(error).to.have.property('code', 'EFOO');
    });