Unit test for grape on rails with airborne framework

Bài viết này giả định bạn đã có kiến thức cơ bản về Web API with rails and grape gem, nếu chưa, vui lòng đọc bài viết của mình trước khi đi tiếp 🙂
Bài viết cũng được viết dựa trên source code của bài viết kia.

airborne

airborne là một ruby gem, một framework dựa trên rspecs hỗ trợ việc viết unit test cho rails API project. airborne tập trung vào test những response mà server trả về.

Ở bài viết này, mình sử dụng grapegrape-rabl để viết WEB API trên rails

Tích hợp

Gemfile

Thêm gem sau vào Gemfile

Cập nhật Gemfile:

Khởi tạo môi trường

Mở terminal, cd đến thư mục rails và chạy lệnh sau

Lệnh này sẽ tạo thư mục /spec trong thư mục gốc rails của bạn, vào xem thư mục /spec bạn sẽ thấy có ba file:
.rspec
spec/spec_helper.rb
spec/rails_helper.rb
Ba file này phục vụ cho việc cấu hình môi trường, mọi thứ ở mặc định là đủ để làm việc, tuy nhiên, bạn có thể vào từng file để biết thêm thông tin.

Code code code

Trong thư mục /spec, tạo thư mục /integration, thư mục này sẽ chứa các test về tích hợp: thêm mới book, lấy thông tin về một/toàn bộ books.

Trong thư muc /integration, tạo file add_book_spec.rb, hậu tố _spec là bắt buộc đối với rspecs.
Trong add_book_spec.rb, thêm hai require:

Cấu hình base_url:

Mở file spec/spec_helper.rb, thêm nội dung sau vào trên cùng file:

Khung test

Trong mỗi file test, để bắt đầu một khối test, ta dùng từ khoá describe:

Trong một file test, ta có thể khai báo nhiều khối như này.

Tiền xử lý

Các test case thường sẽ dùng chung nhiều thông tin, nên ta cần thao tác tiền xử lý để khởi tạo các thông số cần thiết sẽ dùng ở các test case trong block.

Để cho code ngắn gọn, từ đây trở xuống, ta sẽ ngầm định với nhau là các test case sẽ được viết trong block Add book ở trên.

Cú pháp gọi API

GET

Phương thức GET, được gọi như sau:

Trong đó:
api_path: đường dẫn đến api action của rails, vd: '/books/add'
{header_hash}: request header dạng hash, vd: {'Access-Token' => 'foo', 'lorem' => 'ipsum'}
Ví dụ:

POST

Phương thức POST, được gọi như sau:

Ví dụ:

PUT, PATCH, DELETE

Các phương thức này tương tự như GETPOST, bạn có thể tìm hiểu thêm trên trang github của airborne.

Expectation

Cho một APIresponse như sau:

expect_json_types

Lệnh này kiểm tra kiểu của các trường trong response

Các kiểu được hỗ trợ:

Nếu một trường nào đó là tuỳ chọn - optional thì ta thêm hậu tố or_null vào các kiểu ở trên:

expect_json

Kiểm tra nội dung của response:

Ngoài ra ta cũng có thể dùng biểu thức chính quy để kiểm tra nội dung:

expect_status

Kiểm tra HTTP status của response:

Thao tác với mảng

Cho một APIresponse như sau:

Ta có thể dùng dấu chấm . để truy cập tới các phần tử của mảng:

Chú ý:
data.books.*: duyệt tất cả các phẩn tử của mảng
data.books.?: chọn một phần tử bất kỳ của mảng
*? có thể dùng lồng thoá mái.

DateTime

Mặc định thì JSON không hỗ trợ DateTime, nhưng airborne thì có:

Hay

Chạy các test case

Lưu ý

Lỗi: Api request returned invalid json

Lỗi này xảy ra khi bạn sử dụng sai đường dẫn, ví dụ:
config.base_url = 'http://localhost:3000/api/v1'nhưng lại gọi get 'books/all' thì sẽ ra đường dẫn:
http://localhost:3000/api/v1books/all (thiếu dấu /).
Vậy nên, để tránh lỗi này thì nên cấu hình tiền xử lý:

và gọi get @get_all_book_path cho các test case có sử dụng chung path.

Nhiều phương thức nữa

Trong giới hạn bài viết giới thiệu, mình chỉ giới thiệu một số phương thức hay dùng, các phương thức khác các bạn có thể xem thêm tại trang github của airborne.

Source code:

Toàn bộ mã nguồn của dự án bạn có thể xem tại:

Source code on git hub

Source code on git hub unit-test branch

Hoặc bạn có thể clone trực tiếp unit-test branch bằng lệnh sau:

Lập trình và hơn thế nữa

Spread the love
  • 1
  •  
  •  
  •  
  •  
    1
    Share

Leave a Reply

1 Comment on "Unit test for grape on rails with airborne framework"

avatar
  Subscribe  
newest oldest most voted
Notify of
trackback

[…] web service, các bài khác bạn có thể xem tại: 1. Web API with rails and grape gem 2. Unit test for grape on rails with airborne framework 3. Rails API’s documentation with […]