javascript中の非同期方法のユニットテストとPromise

2220 ワード

後端開発者として、会社のプロジェクトの必要性から、最近Javascriptに転向しました.当社はTDD(テストドライブ開発)と100%カバー率の開発原則を守っていますので、js開発をする時、Jsコードをユニットテストします.普通のjsコードはいいですが、非同期コード(例えば、timers.setTimeout(calback)に遭遇しました.弊社のプロジェクトの特殊性のため、第三者のテストフレームを導入することはできません.オリジナルのjsメソッドと特性を使ってユニットテストを行うしかありません.つまり、私達のユニットテストフレームとastertライブラリは全部自分で書き直しました.
最後に老馬の文章を発見しました.Testing Aynchronous JavaScript.に関する方法を紹介しました.
全体の考え:mockは非同期的にcalbackを呼び出す方法を変えて、直接calbackを直ちに呼び出します.例えば、ajax要求に対してユニットテストを行うなら、テストファイルには$ajax.
 $.ajax = function(ajaxOpts) {
      var doneCallback = ajaxOpts.done;
      doneCallback(simulatedAjaxResponse);
 };
そして、この文章はPromiseを使ってcalbackの代わりに非同期的な方法を作ることを勧めています.
Promise
  • コア思想:懸念点は、operationの呼び出しから処理operationの結果に移る.
  • 1,Promise
  • 方法の呼び出しは、操作の結果ではなくpromiseに戻される.
  • promiseは、プロキシであり、動作を表すfuture result.
  • です.
  • Promiseは、in processに対して非同期的に動作するパッケージであり、方法から戻り、方法に伝えられ、queueに格納されている.
  • jqueryのdefferはpromiseに属しています.これはpromiseが解決するのが遅延を伴うイベントであることを示しています.このイベントは未来のある適当な点に延期されて実行されます.
  • 実行プロセス:promiseにcalbackを登録し、操作が完了し、結果が利用できる場合、promiseによってcalbackを実行します.
  • 2,Promiseと非同期
  • 同期方法の特性:return value&throw exception.
  • Promiseは、同期された2つの特性を非同期的に与えています.この方法はPromiseに戻らなければならないと規定されています.
  • Promiseオブジェクトには3つの状態があります.
  • Pending–Promiseオブジェクトの初期状態は、タスクの完了または拒否されるまで待つ.
  • Fulfilled–タスクの実行が完了し、成功した状態.
  • Rejectd–タスクの実行が完了し、失敗した状態
  • Promiseのオプション行動:
  • は一つの値で満たされます.
  • 拒否してexceptionが付いています.
  • これは、then方式で受信された2つのコールバック関数に反映される.
  • 3,The n
  • thenは、統合されたセットにcalbacksを接続するためではなく、
  • ではなく、Promiseにtransformationを適用し、この変換から新たなpromiseを生成する.
  • 4,Immutable promise
  • 方法は新しいpromiseを返さなければなりません.このように一つのpromiseを複数の消費者に割り当てる場合、それらの状態はお互いに干渉しないです.
  • promiseがfulfilled/failedにされた後に、それはimmutableのです.
  • promiseの変換は、4つの場合があります.(2*2、第2節Promiseのオプション行動を参照してください.).
  • 、Jqueryのpromiseは簡単にstate muteを預けられたpromiseに送ります.
  • 5,Exception
  • は、異常を捕捉して、rejectionに変換することにより、intentional(throw new Error("bad data"))/unintentional(aFunctionThatDoesNotExist())の異常を処理する.
  • 異常に最近のレガシーハンドルに泡ができます.
  • 6,Promise仕様
  • Promiseは、thenメソッドの属性を含むオブジェクトです.
  • このようにしてpromiseの実現を全く知らないで、ライブラリコードを作成することができます.