JavaScript >> Javascript 文檔 >  >> Node.js

使用 Mocha 在 Node.js 中進行測試驅動開發

誰需要測試驅動開發?

想像一下,您需要在現有界面上實現一個複雜的功能,例如,評論上的“喜歡”按鈕。如果沒有測試,您將不得不手動創建用戶、登錄、創建帖子、創建不同的用戶、使用不同的用戶登錄並喜歡帖子。累嗎?如果你需要做 10 到 20 次才能找到並修復一些討厭的錯誤怎麼辦?如果您的功能破壞了現有功能,但您在發布 6 個月後發現它,因為沒有測試!

摩卡:簡單、靈活、有趣

不要浪費時間為一次性腳本編寫測試,但請適應主要代碼庫的測試驅動開發的習慣。在開始時花費一點時間,您和您的團隊將在以後節省時間並在推出新版本時充滿信心。測試驅動開發是一件非常非常非常好的事情。

快速入門指南

按照此快速指南使用 Mocha 在 Node.js 中設置測試驅動開發流程。

通過執行以下命令全局安裝 Mocha:

$ sudo npm install -g mocha

我們還將使用兩個庫,Superagent 和 LeanBoost 的 expect.js。要安裝它們,請在您的項目文件夾中啟動 npm 命令,如下所示:

$ npm install superagent
$ npm install expect.js   

使用 .js 打開一個新文件 擴展名和類型:

var request = require('superagent');
var expect = require('expect.js');

到目前為止,我們已經包含了兩個庫。測試套件的結構將如下所示:

describe('Suite one', function(){
  it(function(done){
  ...
  });
  it(function(done){
  ...
  });
});
describe('Suite two', function(){
  it(function(done){
  ...
  });
});

在這個閉包中,我們可以向我們的服務器發送請求,該服務器應該在 localhost:8080 運行:

...
it (function(done){
  request.post('localhost:8080').end(function(res){
    //TODO check that response is okay
  });
});
...

Expect 會給我們提供方便的函數來檢查我們能想到的任何條件:

...
expect(res).to.exist;
expect(res.status).to.equal(200);
expect(res.body).to.contain('world');
...

最後,我們需要添加 done() 調用以通知 Mocha 異步測試已完成其工作。我們第一個測試的完整代碼如下所示:

var request = require('superagent');
var expect = require('expect.js');
  
describe('Suite one', function(){
 it (function(done){
   request.post('localhost:8080').end(function(res){
    expect(res).to.exist;
    expect(res.status).to.equal(200);
    expect(res.body).to.contain('world');
    done();
   });
  });
});

如果我們想變得花哨,我們可以添加 beforebeforeEach 根據其名稱,將在測試(或套件)之前執行一次或每次在測試(或套件)之前執行的鉤子:

before(function(){
  //TODO seed the database
});
describe('suite one ',function(){
  beforeEach(function(){
    //todo log in test user
  });
  it('test one', function(done){
  ...
  });
});

注意 before 和 beforeEach 可以放在 describe 構造的內部或外部。

要運行我們的測試,只需執行:

$ mocha test.js

使用不同的報告類型:

$ mocha test.js -R list
$ mocha test.js -R spec

Tutorial JavaScript 教程
  1. Angular UI 組件 - 導演剪輯

  2. Const 是 JavaScript 和掌握單元測試的謊言

  3. JavaScript 中 undefined 和 null 的區別

  4. 使用 GH-pages 部署靜態站點

  5. 如何在 CSS / JavaScript 中用水平線顯示經典組合分數?

  6. 使用此站點為開源做出貢獻

  7. 我應該在 React 16 的 componentDidUpdate 中使用 setState 條件更新嗎?

  1. HTML5 為您提供的 10 個超級大國(而您並未使用)

  2. Javascript 中的 CJS、AMD、UMD 和 ESM 到底是什麼?

  3. 為什麼我只取回最後一次“hasOwnProperty”調用的結果?

  4. 文件上傳與 FilePond 反應

  5. jide.js 簡介

  6. 將自製的 Vue 3 庫導入 Vue 3 項目時:“未捕獲的 TypeError:Cannot read properties of null (reading ‘isCE’)”

  7. 如何將聚合數組傳遞給 JavaScript?

  1. 代碼和 Scrum 100 天中的第 28 天:Next.js 為生產而增壓

  2. 如何使用 React 上下文 API?

  3. 離子反應選擇器示例

  4. 使用 Docker 對 gRPC 服務進行負載平衡