Испытайте отказ с Чаем, как и обещали
Я хочу проверить функцию, возвращающую обещание.
В этом конкретном тесте ожидается, что обещание будет отклонено с объектом Error, содержащим классическое поле message
(в этом тесте он должен быть равен "my error message"
) и настраиваемое поле, которое я добавил с именем code
, который является строкой (например, "EACCESS", "ERIGHT" и т.д., в этом тесте ожидается, что она будет равна "EFOO"
)
Я хочу использовать chai-as-обещанный для этого.
return expect(foo()).to.eventually.be.rejectedWith("my error message");
Это утверждение работает, но теперь я также хочу проверить поле code
.
Как это сделать?
Ответы
Ответ 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');
});