ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScriptユニットテストでの約束:決定的なガイド

JavaScriptユニットテストでの約束:決定的なガイド

Jennifer Aniston
リリース: 2025-02-19 12:21:09
オリジナル
317 人が閲覧しました

Promises in JavaScript Unit Tests: the Definitive Guide

JavaScriptは非同期コーディングを簡素化することを約束しますが、それらをテストするのは難しい場合があります。 このガイドは、単体テスト内で約束を効果的に処理する方法を明確にし、一般的な落とし穴を避け、コードの読みやすさを改善します。 これらの手法を示すサンプルプロジェクトは、著者のWebサイト(元のテキストで提供されていないリンク)で入手できます。

キーテイクアウト:

    単体テストでの処理は複雑であり、慎重に管理されなければ誤検知につながる可能性があります。
  • Mochaの組み込みの約束サポートは、拒否された約束のテストに自動的に失敗し、プロセスを簡素化します。
  • 直接の約束の主張を有効にし、テストの明確さを強化します
  • テスト機能から常に約束を返して、Mochaがそれを正しく認識して処理することを確認してください。
  • chai-as-promised
  • 始めましょう(Mocha&Chai):

モカとチャイをインストール:

約束をテストするための素朴なアプローチは、しばしば冗長で読みやすいテストをもたらします:

npm install mocha chai
ログイン後にコピー
ログイン後にコピー

コールバックとエラー処理は、不必要な複雑さを追加します。 適切なエラー処理がなければ、拒否された約束は誤検知につながる可能性があります。

var expect = require('chai').expect;

it('should do something with promises', function(done) {
  var blah = 'foo';
  var result = systemUnderTest();
  result.then(function(data) {
    expect(data).to.equal(blah);
    done();
  }, function(error) {
    assert.fail(error);
    done();
  });
});
ログイン後にコピー
Mocha and Promises:

done()

Mochaの組み込みの約束サポートは、これを簡素化します:

拒否された約束は、自動的にテストに失敗します。 最初の例を改善できます:

約束を返すことで、
it('should fail the test', function() {
  return Promise.reject('this promise will always be rejected');
});
ログイン後にコピー
と明示的なエラー処理の必要性がなくなります。

var expect = require('chai').expect;

it('should do something with promises', function() {
  var blah = 'foo';
  var result = systemUnderTest();
  return result.then(function(data) {
    expect(data).to.equal(blah);
  });
});
ログイン後にコピー

done()でのテストの改善

インストール

chai-as-promised このライブラリでは、より簡潔なアサーションが可能になります:

chai-as-promised

キーワードは、約束の非同期性を処理します。 常に約束を返すことを忘れないでください。 さまざまなチャイアサーションが
npm install chai-as-promised
ログイン後にコピー

で動作します

var chai = require('chai');
var expect = chai.expect;
var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);

it('should do something with promises', function() {
  var blah = 'foo';
  var result = systemUnderTest();
  return expect(result).to.eventually.equal(blah);
});
ログイン後にコピー
有用なパターン:

eventually

    オブジェクトの比較
  • ディープオブジェクトの比較にはまたはeventually.deep.equalを使用してください。eventually.become
  • 特定のオブジェクトプロパティ:チェーンは、特定のプロパティにアクセスして主張することを約束します。 ES6矢印関数は、読みやすさを向上させることができます
  • 複数の約束:
  • 複数の約束を同時に処理するために(ただし、単一のテストで複数のアサーションからの潜在的なコードの臭いに注意してください)。 Promise.all複数の約束を比較する:
  • を使用して、約束を解決してから結果を比較します。
  • 障害の主張:拒否のアサーションにPromise.allおよび
  • を使用します。
  • テストフック:to.be.rejectedは、モカのto.be.rejectedWith
  • 、およびフックでシームレスに仕事をすることを約束します。 before afterbeforeEach約束とock/スタブ(sinon.jsを使用):afterEach
sinon.jsをインストールします:

を使用して、約束を返すスタブを作成します。 単純化された約束のスタブについては、

を検討してください

npm install mocha chai
ログイン後にコピー
ログイン後にコピー
結論:

sinon.stub().returns(Promise.resolve/reject(...)) sinon-as-promisedMocha、Chai、および

を使用すると、テストの約束が大幅にきれいになり、読みやすくなります。 テスト機能から常に約束を返してください。 提供されたサンプルプロジェクト(リンクは利用できません)は実用的な例を提供します。

よくある質問(FAQ):(元のFAQは長さと冗長性のために省略されています。それらは、記事に既に存在する情報を主にカバーしています。

以上がJavaScriptユニットテストでの約束:決定的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート