web-dev-qa-db-ja.com

約束通りチャイで拒否をテストする

約束を返す関数をテストしたい。

この特定のテストでは、promiseは、古典的なmessageフィールドを含むErrorオブジェクトで拒否されると予想されます(このテストでは、"my error message")およびcodeという名前のカスタムフィールドを追加しました。これは文字列です(「EACCESS」、「ERIGHT」など)。このテストでは、"EFOO"

そのために、chai-as-promisedを使用したいと思います。

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

このアサーションは機能していますが、今はcodeフィールドもテストしたいと思います。
どうやってするか?

32
Guid

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')
43
Keithamus

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');
    });
31
Markko Paas

@Markko Paasのソリューションは、「最終的に」追加するまで機能しませんでした。さもなければ、拒否された値は常に{}空のオブジェクトになります。

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

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
    });
  });
});
1
Rich Apodaca