Gem rspec-kickstarter, Auto generate rspec code
Bài đăng này đã không được cập nhật trong 8 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-kickstartercho 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-kickstarternà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 ./apprspec-kickstarter ./librspec-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.rbvớ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.rbcó 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.rbta bổ sung thêm 1 function có tên làadditional_functionnhư 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.rbsẽ đượ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
 
  
 