Gem rspec-kickstarter, Auto generate rspec code
Bài đăng này đã không được cập nhật trong 7 năm
- Giới thiệu
- TDD(Test-driven development) là một cách tiếp cận rất hữu ích và cần thiết khi thực hiện dự án, nhưng thực tế nhiều dự án được triển khai mà không hoàn toàn dựa trên TDD và đôi khi chúng ta phải bổ sung các testcase cho các dự án này. Trong tình huống như vậy thì rspec-kickstarter là một công cụ hữu ích.
- Theo đúng quy trình ta cần viết các test TDD trước khi thực hiện việc viết code. Nhưng không phải lúc nào cũng dễ dàng để để làm đc điều này vì:
- Các developer có nhiều việc phải làm trước khi bắt đầu viết các phần thiết yếu của testcase.
- Thật lộn xộn khi tạo ra một tệp tin mới hoặc tìm ra tệp spec hiện có, tìm ra các trường hợp thử nghiệm thiếu và viết các nội dung thông thường bắt đầu bằng 'describe'.
- Để giải quyết vấn đề này thì
rspec-kickstarter
cho phép các developer có thể viết Test ngay lập tức. Nếu file spec chưa tồn tại nó sẽ tạo ra một tập tin spec mới. Hơn nữa, nó bổ sung các trường hợp thử nghiệm thiếu (có chú thích là TODO) vào tệp tin spec hiện có nếu chúng được tìm thấy.
Lưu ý:
- Việc tạo các trường hợp test thử nghiệm cho các method không phải là hoàn hảo nhưng nó là khá quan trọng để giảm rào cản tâm lý, và khắc phục được những vấn đề đã nêu trên.
- Các trường hợp test mà rspec-kickstarter đưa ra chỉ là các testcase đơn giản, ko đầy đủ các trường hợp có thể xảy ra trong code của bạn, vì vậy bạn cần được định nghĩa thêm các trường hợp này.
- Vì thế theo mình thấy thì việc sử dụng
rspec-kickstarter
này chủ yếu là:- Để tạo ra một cái khung cơ bản cho file spec của mình.
- Để mình biết được mình sẽ test những nội dung gì.
- Giúp mình đỡ bỡ ngỡ khi bắt đầu viết rspec, ko biết bắt đầu từ đâu, ko biết phải test những cái gì bla bla.
- Trong bài viết này mình sẽ trình bày một số ví dụ về việc áp dụng
rspec-kickstarter
- Cài đặt
gem install rspec-kickstarter
- Sử dụng
rspec-kickstarter ./app
rspec-kickstarter ./lib
rspec-kickstarter ./lib/yourapp/util.rb
- Các option:
Bạn có thể xem các options bằng cách gõ lệnh sau vào terminal:
rspec-kickstarter -h
Usage: rspec-kickstarter [options]
-f Create if absent or append to the existing spec
--force
-n Dry run mode (shows generated code to console)
--dry-run
-r Run in Rails mode
--rails
-o VAL Output directory (default: ./spec)
--output-dir VAL
-D VAL Delta tempalte path (e.g. ./rails_controller_delta.erb)
--delta-template VAL
-F VAL Full template path (e.g. ./rails_controller_full.erb)
--full-template VAL
-v Print version
- Ví dụ
5.1 Với các file nằm trong
rspec-kickstarter ./lib
- Đầu tiên ta tạo file
lib/foo/auto_test.rb
với nội dung
module Foo class AutoTest def self.fuction_1 a, b end def fuction_2 end private def fuction_3 a end end end
- Hiện tại file này chưa có spec file. giờ ta sẽ sử dụng rspec-kickstarter để generate ra code spec. Ta chạy lệnh
$ rspec-kickstarter lib/foo/auto_test.rb
./spec/foo/auto_test_spec.rb created.
- Kết quả ta được file auto_test_spec.rb tạo theo đúng cây thư mục trong folder spec:
/spec/foo/auto_test_spec.rb
có nội dụng như sau:
# -*- encoding: utf-8 -*- require 'spec_helper' require 'foo/auto_test' describe Foo::AutoTest do # TODO: auto-generated describe '#fuction_1' do it 'works' do a = double('a') b = double('b') result = Foo::AutoTest.fuction_1(a, b) expect(result).not_to be_nil end end # TODO: auto-generated describe '#fuction_2' do it 'works' do auto_test = Foo::AutoTest.new result = auto_test.fuction_2 expect(result).not_to be_nil end end end
- Đầu tiên ta tạo file
5.2 Bổ sung các test case bị thiếu
- Ta có thể sử dụng -f để thêm các testcase bị thiếu trong các spec hiện có.
- Ví dụ trong file
auto_test.rb
ta bổ sung thêm 1 function có tên làadditional_function
như sau:
module Foo
class AutoTest
def self.fuction_1 a, b
end
def fuction_2
end
def additional_function
end
private
def fuction_3 a
end
end
end
- Tiếp đến ta thực hiện lệnh:
$ rspec-kickstarter -f lib/foo/auto_test.rb
./spec/foo/auto_test_spec.rb modified.
- Và kết quả đạt được sau khi modified thì file
/spec/foo/auto_test_spec.rb
sẽ được bổ sung thêm:
# TODO: auto-generated
describe '#additional_function' do
it 'works' do
auto_test = Foo::AutoTest.new
result = auto_test.additional_function
expect(result).not_to be_nil
end
end
5.3 Với các file nằm trong rspec-kickstarter ./app
- Đối với các file trong controller
- Ta chạy lệnh
rspec-kickstarter -r app/controllers/root_controller.rb
- và kết quả ta được
spec/controllers/root_controller_spec.rb
:
# -*- encoding: utf-8 -*-
require 'rails_helper'
describe CommentsController do
# TODO: auto-generated
describe 'GET index' do
it 'works' do
get :index, {}, {}
expect(response.status).to eq(200)
end
end
# TODO: auto-generated
describe 'GET show' do
it 'works' do
get :show, {}, {}
expect(response.status).to eq(200)
end
end
# TODO: auto-generated
describe 'GET new' do
it 'works' do
get :new, {}, {}
expect(response.status).to eq(200)
end
end
# TODO: auto-generated
describe 'GET edit' do
it 'works' do
get :edit, {}, {}
expect(response.status).to eq(200)
end
end
# TODO: auto-generated
describe 'POST create' do
it 'works' do
post :create, {}, {}
expect(response.status).to eq(200)
end
end
# TODO: auto-generated
describe 'PUT update' do
it 'works' do
put :update, {}, {}
expect(response.status).to eq(200)
end
end
# TODO: auto-generated
describe 'DELETE destroy' do
it 'works' do
delete :destroy, {}, {}
expect(response.status).to eq(200)
end
end
end
- Tương tự bạn có thể tạo file spec đối với các file trong helper, model...
- Kết luận
- Trên đây mình đã giới thiệu các vấn đề cơ bản để sử dụng
gem rspec-kickstarter
để auto generate rspec code. Với nguồn tham khảo tạihttps://github.com/seratch/rspec-kickstarter
. - Và tác dụng của việc áp dụng gem này vào dự án thì đối với người mới viết rspec sẽ không phải bỡ ngỡ khi không biết bắt đầu từ đâu. Còn đối với người đã có kinh nghiệm thì việc dùng rspec-kickstarter sẽ giúp mình tạo 1 khung viết test một cách nhanh chóng.
All rights reserved