約束を返す関数をテストしたい。
この特定のテストでは、promiseは、古典的なmessage
フィールドを含むErrorオブジェクトで拒否されると予想されます(このテストでは、"my error message"
)およびcode
という名前のカスタムフィールドを追加しました。これは文字列です(「EACCESS」、「ERIGHT」など)。このテストでは、"EFOO"
)
そのために、chai-as-promisedを使用したいと思います。
return expect(foo()).to.eventually.be.rejectedWith("my error message");
このアサーションは機能していますが、今はcode
フィールドもテストしたいと思います。
どうやってするか?
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')
ChaiAsPromisedのバージョン5.1.0を使用すると、Keithamusのソリューションは機能しませんでした-rejectedWithはアサートするエラーオブジェクトを提供しませんでしたが、「rejected」は機能しました。
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');
});
@Markko Paasのソリューションは、「最終的に」追加するまで機能しませんでした。さもなければ、拒否された値は常に{}空のオブジェクトになります。
return expect(foo())
.to.eventually.be.rejected
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
rejected.then
を使用して、エラーに関する複雑なテストを実行できます。
it('throws a complex error', function () {
return expect(foo()).to.eventually.be.rejected.then((error) => {
expect(error.code).to.equal('expected code');
// other tests
// alternatively,
expect (error).to.eql({
foo: 'foo',
bar: 'bar
});
});
});