Xu Hướng 7/2022 # Unit Test Cho Nodejs Với Mocha # Top View

Xem 8,415

Bạn đang xem bài viết Unit Test Cho Nodejs Với Mocha được cập nhật mới nhất ngày 04/07/2022 trên website Ezlearning.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Cho đến thời điểm hiện tại, bài viết này đã đạt được 8,415 lượt xem.

--- Bài mới hơn ---

  • Hướng Dẫn Viết Unit Test Cho Laravel (P3)
  • Viết Đặc Tả Use Case Sao Đơn Giản Nhưng Hiệu Quả?
  • Hướng Dẫn Đặc Tả Use Case Quản Lý Khách Sạn 2022
  • Bản Vẽ Use Case (Use Case Diagram)
  • Use Case Diagram Và 5 Sai Lầm Thường Gặp
  • Bài viết này mình sẽ hướng dẫn các bạn viết bằng Mocha (một Javascript testing framework). Như các bạn cũng biết, việc Unit test cho một dự án là vô cùng quan trọng. Người ta đã phải bỏ công, bỏ sức ra để thiết kế những kiến trúc, mô hình để dự án có thể dễ Unit Test hơn. Điển hình như Android có mô hình MVP, web thì có MVC, MVVM…

    Để cho bài viết dễ hiểu, mình sẽ thực hiện unit test cho một ứng dụng cụ thể. Đó là RESTful APIs tạo bởi Nodejs.

    #Unit Test là gì?

    Unit Test là một cơ chế để kiểm tra từng hàm trong mã nguồn của bạn. Unit Test đảm bảo từng method trong mã nguồn hoạt động đúng yêu cầu, xử lý được các ngoại lệ, kiểm tra dữ liệu nhập vào và dữ liệu trả về có chính xác với yêu cầu hay không.

    Nhiều bạn cứ nghĩ Unit Test thì do tester thực hiện nên hay bỏ qua kỹ năng này. Nhưng thực tế, Unit Test phải do developer thực hiện. Chỉ có dev mới hiểu và viết được chính xác các test case mà thôi.

    #Ví dụ viết Unit Test cho Nodejs

    $ npm install -g [email protected]

    1. Cấu trúc testing cho dự án NodeJs

    Để tạo unit test cho dự án, bạn tạo thêm một thư mục Test trong dự án. Sau đó tạo thêm một file test. Ví dụ là: test-server.js

    Đại khái, cấu trúc dự án bạn sẽ thấy như sau:

    ├── package.json ├── server │ ├── app.js │ ├── models │ │ └── blob.js │ └── routes │ └── index.js └── test └── test-server.js

    Còn đây là cấu trúc một test case cơ bản:

    });

    Nếu bạn muốn nhóm nhiều test case lại thành một group thì có thể làm như sau:

    // Ví dụ về nhóm nhiều test case thành một group describe('Blobs', function() { it('should list ALL blobs on /blobs GET'); });

    2. Thêm thư viện cần thiết

    Trong ví dụ này, mình sẽ dụng thư viện Chai (v3.2.0) và chai-http (v 1.0.0) để tạo kết nối HTTP sau đó sẽ test kết quả trả về.

    Cài đặt:

    $ npm install [email protected] [email protected] --save-dev

    Sau đó update lại file chúng tôi như sau:

    var chai = require('chai'); var chaiHttp = require('chai-http'); var server = require('../server/app'); var should = chai.should(); chai.use(chaiHttp); describe('Blobs', function() { it('should list ALL blobs on /blobs GET'); it('should add a SINGLE blob on /blobs POST'); });

    OK, về cơ bản là chúng ta đã hiểu và chuẩn bị xong, giờ bắt đầu viết test case.

    3. Viết test case cho các hàm GET

    Các bạn update lại test case đầu tiên như sau:

    it('should list ALL blobs on /blobs GET', function(done) { chai.request(server) .get('/blobs') .end(function(err, res){ res.should.have.status(200); done(); }); });

    Chúng ta truyền vào hàm ẩn danh (callback) một tham số done (thực chất nó là một hàm). Tham số này sẽ kết thúc test case khi được gọi.

    Về ví dụ test case trên thì rất dễ hiểu. Nó đơn giản là chúng ta sẽ tạo một request (GET) tới API URL: “/blobs”. Sau đó kiểm tra xem mã trả về có phải có status là 200 hay không!?

    Cũng dễ hiểu phải không?

    Để chạy test case, chúng ta gọi chạy lệnh mocha

    $ mocha Blobs Connected to Database! GET /blobs 200 19.621 ms - 2 ✓ should list ALL blobs on /blobs GET (43ms) - should add a SINGLE blob on /blobs POST 1 passing (72ms) 4 pending

    Hmm. Nếu chỉ Unit test mỗi status thì cũng không có nhiều ý nghĩa lắm. Thử kiểm tra thêm vài yếu tố nữa xem sao.

    it('should list ALL blobs on /blobs GET', function(done) { chai.request(server) .get('/blobs') .end(function(err, res){ res.should.have.status(200); res.should.be.json; res.body.should.be.a('array'); done(); }); });

    Viết mấy test case này cũng đơn giản nhỉ. Đọc code cũng hình dung được ý định của test case, giống như viết văn vậy.

    4. Viết test case cho các hàm POST

    Bạn xem lại mã nguồn của ứng dụng, khi có một “blob” được thêm mới , sẽ thông báo cho client biết với nội dụng như dưới:

    { "SUCCESS": { "__v": 0, "name": "name", "lastName": "lastname", "_id": "some-unique-id" } }

    OK, suy nghĩ một lúc về kết quả mong muốn và viết test case thôi.

    it('should add a SINGLE blob on /blobs POST', function(done) { chai.request(server) .post('/blobs') .send({'name': 'Java', 'lastName': 'Script'}) .end(function(err, res){ res.should.have.status(200); res.should.be.json; res.body.should.be.a('object'); res.body.should.have.property('SUCCESS'); res.body.SUCCESS.should.be.a('object'); res.body.SUCCESS.should.have.property('name'); res.body.SUCCESS.should.have.property('lastName'); res.body.SUCCESS.should.have.property('_id'); res.body.SUCCESS.name.should.equal('Java'); res.body.SUCCESS.lastName.should.equal('Script'); done(); }); });

    Cho đến thời điểm này, các bạn có để ý là với các test case, chúng ta đều tương tác trực tiếp với database không? Thực tế, nếu làm như vậy sẽ làm hỏng dữ liệu test của chúng ta.

    Do đó, với unit test, chúng ta nên fake luôn cả dữ liệu với mỗi test case nếu cần. Để dễ hiểu, với test case cho hàm POST, thay vì gọi tới API POST và lưu một blob vào database. Chúng ta sẽ fake việc lưu vào database, và trả kết quả như bình thường.

    Để làm được điều này, chúng ta có một số hàm như beforeEach() and afterEach() hooks. Đúng như tên gọi của nó, những này cho phép chúng ta thực hiện một số tác vụ chuẩn bị, kết thúc khi gọi hàm để test.

    Đầu tiên, mình sẽ thêm một file _config.js vào “server” folder, để tách URI tương tác với database, phục vụ có unit test.

    var config = {}; config.mongoURI = { development: 'mongodb://localhost/node-testing', test: 'mongodb://localhost/node-test' }; module.exports = config;

    Sau đó, cập nhật lại chúng tôi để cấu hình môi trường ứng dụng. Ý là, với môi trường developement thì tương tác với database này, còn khi thành product thì sẽ tương tác với database khác.

    // *** config file *** var config = require('./_config'); mongoose.connect(config.mongoURI); } });

    Cuối cùng là viết unit test:

    process.env.NODE_ENV = 'test'; var chai = require('chai'); var chaiHttp = require('chai-http'); var mongoose = require("mongoose"); var server = require('../server/app'); var Blob = require("../server/models/blob"); var should = chai.should(); chai.use(chaiHttp); describe('Blobs', function() { Blob.collection.drop(); beforeEach(function(done){ var newBlob = new Blob({ name: 'Bat', lastName: 'man' }); newBlob.save(function(err) { done(); }); }); afterEach(function(done){ Blob.collection.drop(); done(); });

    Bây giờ thì trước mỗi test case, database được clear, thêm một blob. Khi test case kết thúc thì lại xóa database trước khi sang test case khác.

    Như vậy mình đã kết thúc phần chia sẻ những kiến thức bản để viết unit test cho Nodejs sử dụng thư viện mocha.

    Mình nhắc lại là việc viết unit test không khó nhưng lại rất quan trọng và lại rất hay được các bạn cố tình quên.

    --- Bài cũ hơn ---

  • Viết Unit Test Trong C# Với Nunit
  • Hướng Dẫn Viết Unit Test Cho Laravel (P2)
  • Unit Test Dùng Để Làm Gì Và Kinh Nghiệm Viết Unit Test Tốt Nhất
  • Unit Test Là Gì? Giới Thiệu Về Unit Test Và Ví Dụ
  • Làm Sao Để Mô Tả Phần Lợi Ích (Why) Trong User Story
  • Cập nhật thông tin chi tiết về Unit Test Cho Nodejs Với Mocha trên website Ezlearning.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!

  • Web hay
  • Links hay
  • Push
  • Chủ đề top 10
  • Chủ đề top 20
  • Chủ đề top 30
  • Chủ đề top 40
  • Chủ đề top 50
  • Chủ đề top 60
  • Chủ đề top 70
  • Chủ đề top 80
  • Chủ đề top 90
  • Chủ đề top 100
  • Bài viết top 10
  • Bài viết top 20
  • Bài viết top 30
  • Bài viết top 40
  • Bài viết top 50
  • Bài viết top 60
  • Bài viết top 70
  • Bài viết top 80
  • Bài viết top 90
  • Bài viết top 100
  • CẦM ĐỒ TẠI F88
    15 PHÚT DUYỆT
    NHẬN TIỀN NGAY

    VAY TIỀN NHANH
    LÊN ĐẾN 10 TRIỆU
    CHỈ CẦN CMND

    ×