<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                關于[ES6 Promises](http://liubin.github.io/promises-book/#es6-promises)的語法我們已經學了一些, 我想大家應該也能夠在實際項目中編寫Promise 的Demo代碼了吧。 這時,接下來你可能要苦惱該如何編寫Promise 的測試代碼了。 那么讓我們先來學習下如何使用?[Mocha](http://mochajs.org/)來對Promise 進行基本的測試吧。 先聲明一下,這章中涉及的測試代碼都是運行在Node.js環境下的。 > 本書中出現的示例代碼也都有相應的測試代碼。 測試代碼可以參考?[azu/promises-book](https://github.com/azu/promises-book)?。 ## 3.1.1\. Mocha Mocha是Node.js下的測試框架工具,在這里,我們并不打算對?[Mocha](http://mochajs.org/)本身進行詳細講解。對?[Mocha](http://mochajs.org/)感興趣的讀者可以自行學習。 Mocha可以自由選擇BDD、TDD、exports中的任意風格,測試中用到的Assert 方法也同樣可以跟任何其他類庫組合使用。 也就是說,Mocha本身只提供執行測試時的框架,而其他部分則由使用者自己選擇。 這里我們選擇使用Mocha,主要基于下面3點理由。 * 它是非常著名的測試框架 * 支持基于Node.js 和瀏覽器的測試 * 支持"Promise測試" 最后至于為什么說?_支持"Promise測試"_?,這個我們在后面再講。 要想在本章中使用Mocha,我們需要先通過npm來安裝Mocha。 ~~~ $ npm install -g mocha ~~~ 另外,Assert庫我們使用的是Node.js自帶的`assert`模塊,所以不需要額外安裝。 首先,讓我們試著編寫一個對傳統回調風格的異步函數進行測試的代碼。 ## 3.1.2\. 回調函數風格的測試 如果想使用回調函數風格來對一個異步處理進行測試,使用Mocha的話代碼如下所示。 basic-test.js ~~~ var assert = require('power-assert'); describe('Basic Test', function () { context('When Callback(high-order function)', function () { it('should use `done` for test', function (done) { setTimeout(function () { assert(true); done(); }, 0); }); }); context('When promise object', function () { it('should use `done` for test?', function (done) { var promise = Promise.resolve(1); // このテストコードはある欠陥があります promise.then(function (value) { assert(value === 1); done(); }); }); }); }); ~~~ 將這段代碼保存為?`basic-test.js`,之后就可以使用剛才安裝的Mocha的命令行工具進行測試了。 ~~~ $ mocha basic-test.js ~~~ Mocha的?`it`?方法指定了?`done`?參數,在?`done()`?函數被執行之前, 該測試一直處于等待狀態,這樣就可以對異步處理進行測試。 Mocha中的異步測試,將會按照下面的步驟執行。 ~~~ it("should use `done` for test", function (done) { //回調式的異步處理 setTimeout(function () { assert(true); done();//調用`done`?后測試結束 }, 0); }); ~~~ 這也是一種非常常見的實現方式。 ## 3.1.3\. 使用`done`?的Promise測試 接下來,讓我們看看如何使用?`done`?來進行Promise測試。 ~~~ it("should use `done` for test?", function (done) { var promise = Promise.resolve(42);//創建名為`Fulfilled`?的promise對象 promise.then(function (value) { assert(value === 42); done();//調用`done`?后測試結束 }); }); ~~~ [`Promise.resolve`](http://liubin.github.io/promises-book/#Promise.resolve)?用來返回promise對象, 返回的promise對象狀態為FulFilled。 最后,通過?`.then`?設置的回調函數也會被調用。 像[專欄: Promise只能進行異步操作?](http://liubin.github.io/promises-book/#promise-is-always-async)?中已經提到的那樣, promise對象的調用總是異步進行的,所以測試也同樣需要以異步調用的方式來編寫。 但是,在前面的測試代碼中,在`assert`?失敗的情況下就會出現問題。 對異常promise測試 ~~~ it("should use `done` for test?", function (done) { var promise = Promise.resolve(); promise.then(function (value) { assert(false);// => throw AssertionError done(); }); }); ~~~ 在此次測試中?`assert`?失敗了,所以你可能認為應該拋出“測試失敗”的錯誤, 而實際情況卻是測試并不會結束,直到超時。 ![promise test timeout](https://box.kancloud.cn/2015-07-20_55ac765042f17.png) Figure 7\. 由于測試不會結束,所以直到發生超時時間未知,一直會處于掛起狀態。 通常情況下,`assert`?失敗的時候,會throw一個error, 測試框架會捕獲該error,來判斷測試失敗。 但是,Promise的情況下?`.then`?綁定的函數執行時發生的error 會被Promise捕獲,而測試框架則對此error將會一無所知。 我們來改善一下[`assert` 失敗的promise測試](http://liubin.github.io/promises-book/#promise-assert-fail), 讓它能正確處理?`assert`?失敗時的測試結果。 測試正常失敗的示例 ~~~ it("should use `done` for test?", function (done) { var promise = Promise.resolve(); promise.then(function (value) { assert(false); }).then(done, done); }); ~~~ 在上面測試正常失敗的示例中,為了確保?`done`?一定會被調用, 我們在最后添加了?`.then(done, done);`?語句。 `assert`?測試通過(成功)時會調用?`done()`?,而?`assert`?失敗時則調用?`done(error)`?。 這樣,我們就編寫出了和?[回調函數風格的測試](http://liubin.github.io/promises-book/#callback-style-test)?相同的Promise測試。 但是,為了處理?`assert`?失敗的情況,我們需要額外添加?`.then(done, done);`?的代碼。 這就要求我們在編寫Promise測試時要格外小心,忘了加上上面語句的話,很可能就會寫出一個永遠不會返回直到超時的測試代碼。 在下一節,讓我們接著學習一下最初提到的使用Mocha理由中的支持"Promises測試"究竟是一種什么機制。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看