成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何在NodeJs中使用Mocha測試框架

本篇文章給大家分享的是有關(guān)如何在NodeJs中使用Mocha測試框架,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)豐寧,十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

安裝與初步的使用

在控制臺窗口中執(zhí)行下列命令:

$ npm install -g mocha
$ mkdir test
$ $EDITOR test/test.js

可以寫如下代碼:

var assert = require('assert');
describe('Array', function() {
 describe('#indexOf()', function () {
  it('should return -1 when the value is not present', function () {
   assert.equal(-1, [1,2,3].indexOf(5));
   assert.equal(-1, [1,2,3].indexOf(0));
  });
 });
});

回到控制臺:

$ mocha

 .

 ? 1 test complete (1ms)

這里mocha會查找當(dāng)前文件目錄下test文件夾下的內(nèi)容,自動執(zhí)行。

斷定庫

這個是判定測試用例是否通過,默認(rèn)下可以用nodejs的assert庫,與此同時,Mocha支持我們使用不同的斷定庫,現(xiàn)在可以支持下面的斷定庫,每個斷定庫的用法有一些差異,自己可以參考相應(yīng)的文檔。

1 should.js(https://github.com/shouldjs/should.js) BDD style shown throughout these docs (BDD模式,本文檔用的都是這個斷定庫)
2 better-assert(https://github.com/tj/better-assert) c-style self-documenting assert()(C-模型下的斷定庫)
3 expect.js (https://github.com/Automattic/expect.js)expect() style assertions (expect模式的斷定庫)
4 unexpected(http://unexpected.js.org/) the extensible BDD assertion toolkit
5 chai(https://github.com/chaijs) expect(), assert() and should style assertions

同步代碼

同步代碼表示測試的是同步函數(shù),上面的Array相關(guān)的例子代碼就是。這個比較好理解。

異步代碼

只所以有異步代碼測試,原因是在nodejs上許多異步函數(shù),如下面的代碼中,只有done()函數(shù)執(zhí)行完畢后,該測試用例才算完成

describe('User', function() {
 describe('#save()', function() {
  it('should save without error', function(done) {
   var user = new User('Luna');
   user.saveAsync(function(err) {
    if (err) throw err;
    done(); // 只有執(zhí)行完此函數(shù)后,該測試用例算是完成。
   });
  });
 });
});

詳解describe和it

上面的實例代碼比較簡單,那么什么是describe和it呢? 大致上,我們可以看出describe應(yīng)該是聲明了一個TestSuit(測試集合) ,而且測試集合可以嵌套管理,而it聲明定義了一個具體的測試用例。 以bdd interface為例,具體的源代碼如下:

  /**
   * Describe a "suite" with the given `title`
   * and callback `fn` containing nested suites
   * and/or tests.
   */
  context.describe = context.context = function(title, fn) {
   var suite = Suite.create(suites[0], title);
   suite.file = file;
   suites.unshift(suite);
   fn.call(suite);
   suites.shift();
   return suite;
  };

   /**
   * Describe a specification or test-case
   * with the given `title` and callback `fn`
   * acting as a thunk.
   */

  context.it = context.specify = function(title, fn) {
   var suite = suites[0];
   if (suite.pending) {
    fn = null;
   }
   var test = new Test(title, fn);
   test.file = file;
   suite.addTest(test);
   return test;
  };

Hooks(鉤子)

實際上這個在寫unit test是很常見的功能,就是在執(zhí)行測試用例,測試用例集合前或者后需要某個回調(diào)函數(shù)(鉤子)。Mocha提供了before(),after(), beforeEach() 和aftetEach(),示例代碼如下:

describe('hooks', function() {
 before(function() {
  // runs before all tests in this block
  // 在執(zhí)行所有的測試用例前 函數(shù)會被調(diào)用一次
 });

 after(function() {
  // runs after all tests in this block
  // 在執(zhí)行完所有的測試用例后 函數(shù)會被調(diào)用一次
 });

 beforeEach(function() {
  // runs before each test in this block
   // 在執(zhí)行每個測試用例前 函數(shù)會被調(diào)用一次
 });

 afterEach(function() {
  // runs after each test in this block
  // 在執(zhí)行每個測試用例后 函數(shù)會被調(diào)用一次
 });

 // test cases
});

hooks還有下列其他用法:

Describing Hooks - 可以對鉤子函數(shù)添加描述,能更好的查看問題
Asynchronous Hooks (異步鉤子): 鉤子函數(shù)可以是同步,也可以是異步的,和測試用例一下,下面是異步鉤子的示例代碼:

 beforeEach(function(done) {
  // 異步函數(shù)
  db.clear(function(err) {
   if (err) return done(err);
   db.save([tobi, loki, jane], done);
  });
 });

Root-Level Hooks (全局鉤子) - 就是在describe外(測試用例集合外)執(zhí)行,這個一般是在所有的測試用例前或者后執(zhí)行。
Pending Tests (掛起測試)

就是有一些測試,現(xiàn)在還沒有完成,有點類似TODO, 如下面的代碼:

describe('Array', function() {
 describe('#indexOf()', function() {
  // pending test below 暫時不寫回調(diào)函數(shù)
  it('should return -1 when the value is not present');
 });
});

Exclusive Tests (排它測試)

排它測試就是允許一個測試集合或者測試用例,只有一個被執(zhí)行,其他都被跳過。如下面測試用例集合:

describe('Array', function() {
 describe.only('#indexOf()', function() {
  // ...
 });
   // 測試集合不會被執(zhí)行
  describe('#ingored()', function() {
  // ...
 });
});

下面是對于測試用例:

describe('Array', function() {
 describe('#indexOf()', function() {
  it.only('should return -1 unless present', function() {
   // ...
  });
   // 測試用例不會執(zhí)行
  it('should return the index when present', function() {
   // ...
  });
 });
});

需要說明的是,對于Hooks(回調(diào)函數(shù))會被執(zhí)行。

Inclusive Tests(包含測試)

與only函數(shù)相反,skip函數(shù),將會讓mocha系統(tǒng)無視當(dāng)前的測試用例集合或者測試用例,所有被skip的測試用例將被報告為Pending。
下面是對與測試用例集合的示例代碼:

describe('Array', function() {
  //該測試用例會被ingore掉 
 describe.skip('#indexOf()', function() {
  // ...
 });
  // 該測試會被執(zhí)行
  describe('#indexOf()', function() {
  // ...
 });
});

下面例子是對具體的測試用例:

describe('Array', function() {
 describe('#indexOf()', function() {
   // 測試用例會被ingore掉
  it.skip('should return -1 unless present', function() {
   // ...
  });
   // 測試用例會被執(zhí)行
  it('should return the index when present', function() {
   // ...
  });
 });
});

Dynamically Generating Tests(動態(tài)生成測試用例)

其實這個在很多其他的測試工具,如NUnit也會有,就是將測試用例的參數(shù)用一個集合代替,從而生成不同的測試用例。下面是具體的例子:

var assert = require('assert');

function add() {
 return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
  return prev + curr;
 }, 0);
}

describe('add()', function() {
 var tests = [
  {args: [1, 2],    expected: 3},
  {args: [1, 2, 3],  expected: 6},
  {args: [1, 2, 3, 4], expected: 10}
 ];
 // 下面就會生成三個不同的測試用例,相當(dāng)于寫了三個it函數(shù)的測試用例。
 tests.forEach(function(test) {
  it('correctly adds ' + test.args.length + ' args', function() {
   var res = add.apply(null, test.args);
   assert.equal(res, test.expected);
  });
 });
});

Interfaces(接口)

Mocha的接口系統(tǒng)允許用戶用不同風(fēng)格的函數(shù)或者樣式寫他們的測試用例集合和具體的測試用例,mocha有BDD,TDD,Exports,QUnit和Require 風(fēng)格的接口。

BDD - 這個是mocha的默認(rèn)樣式,我們在本文中的示例代碼就是這樣的格式。
其提供了describe(), context(), it(), before(), after(), beforeEach(), and afterEach()的函數(shù),示例代碼如下:

 describe('Array', function() {
  before(function() {
   // ...
  });

  describe('#indexOf()', function() {
   context('when not present', function() {
    it('should not throw an error', function() {
     (function() {
      [1,2,3].indexOf(4);
     }).should.not.throw();
    });
    it('should return -1', function() {
     [1,2,3].indexOf(4).should.equal(-1);
    });
   });
   context('when present', function() {
    it('should return the index where the element first appears in the array', function() {
     [1,2,3].indexOf(3).should.equal(2);
    });
   });
  });
 });

TDD - 提供了 suite(), test(), suiteSetup(), suiteTeardown(), setup(), 和 teardown()的函數(shù),其實和BDD風(fēng)格的接口類似(suite相當(dāng)于describe,test相當(dāng)于it),示例代碼如下:

suite('Array', function() {
 setup(function() {
  // ...
 });

 suite('#indexOf()', function() {
  test('should return -1 when not present', function() { 
   assert.equal(-1, [1,2,3].indexOf(4));
  });
 });
});

Exports - 對象的值都是測試用例集合,函數(shù)值都是測試用例。 關(guān)鍵字before, after, beforeEach, and afterEach 需要特別定義。
具體的示例代碼如下:

module.exports = {
 before: function() {
  // ...
 },

 'Array': {
  '#indexOf()': {
   'should return -1 when not present': function() {
    [1,2,3].indexOf(4).should.equal(-1);
   }
  }
 }
};

QUnit - 有點像TDD,用suit和test函數(shù),也包含before(), after(), beforeEach()和afterEach(),但是用法稍微有點不一樣, 可以參考下面的代碼:

function ok(expr, msg) {
 if (!expr) throw new Error(msg);
}

suite('Array');

test('#length', function() {
 var arr = [1,2,3];
 ok(arr.length == 3);
});

test('#indexOf()', function() {
 var arr = [1,2,3];
 ok(arr.indexOf(1) == 0);
 ok(arr.indexOf(2) == 1);
 ok(arr.indexOf(3) == 2);
});

suite('String');

test('#length', function() {
 ok('foo'.length == 3);
});

Require - 該接口允許我們利用require關(guān)鍵字去重新封裝定義 describe ,it等關(guān)鍵字,這樣可以避免全局變量。
如下列代碼:

var testCase = require('mocha').describe;
var pre = require('mocha').before;
var assertions = require('mocha').it;
var assert = require('assert');

testCase('Array', function() {
 pre(function() {
  // ...
 });

 testCase('#indexOf()', function() {
  assertions('should return -1 when not present', function() {
   assert.equal([1,2,3].indexOf(4), -1);
  });
 });
});

上述默認(rèn)的接口是BDD, 如果想使用其他的接口,可以使用下面的命令行:

mocha -ui  接口(TDD|Exports|QUnit...)

Reporters (測試報告/結(jié)果樣式)

Mocha 支持不同格式的測試結(jié)果暫時,其支持 Spec, Dot Matrix,Nyan,TAP…等等,默認(rèn)的樣式為Spec,如果需要其他的樣式,可以用下列命令行實現(xiàn):

mocha --reporter 具體的樣式(Dot Matrix|TAP|Nyan...)

Editor Plugins

mocha 能很好的集成到TextMate,Wallaby.js,JetBrains(IntelliJ IDEA, WebStorm) 中,這里就用WebStorm作為例子。 JetBrains提供了NodeJS的plugin讓我們很好的使用mocha和nodeJs。 

以上就是如何在NodeJs中使用Mocha測試框架,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:如何在NodeJs中使用Mocha測試框架
文章起源:http://jinyejixie.com/article4/poeeoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、域名注冊外貿(mào)網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、網(wǎng)站收錄、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
浙江省| 云梦县| 铜鼓县| 芦溪县| 仁怀市| 西和县| 曲阳县| 鸡东县| 都昌县| 周口市| 龙山县| 崇州市| 宜都市| 炉霍县| 甘洛县| 甘洛县| 宜丰县| 内丘县| 华坪县| 东山县| 利津县| 包头市| 甘泉县| 七台河市| 龙南县| 辽阳市| 白银市| 连平县| 南陵县| 平江县| 通渭县| 呼和浩特市| 马尔康县| 尚志市| 金山区| 兖州市| 靖西县| 梁平县| 丰顺县| 边坝县| 绥德县|