Article:
Bắt đầu với RSpec
1402
ngocdaothanh.myopenid.com 172Updated over 3 years ago |
Bạn đã đọc chán chê [vân vân và vân vân]. Bây giờ, muốn bắt đầu thì cụ thể phải làm thế nào? Một khi đã bắt đầu được, mọi chuyện sẽ suôn sẻ. Như các bác lãnh đạo vẫn nói, hổng chỗ nào ta đắp chỗ đó, sợ quách gì

Tất nhiên là bạn đang dùng Rails? Và nghe nói mặc dù Rails đã tích hợp sẵn thư viện để test rất tiện rồi, nhưng RSpec hay hơn nhiều nên muốn thử? Nào ta bắt đầu.
Tạo cấu trúc thư mục
- Cài RSpec: gem install rspec
- Cài RSpec-Rails: gem install rspec-rails
- Tạo project mới: rails hello
- Xóa thư mục test có sẵn của Rails: cd hello, rm -rf test
- Thêm RSpec vào project: ruby script/generate rspec
create lib/tasks/rspec.rake
create script/autospec
create script/spec
create script/spec_server
create spec
create spec/rcov.opts
create spec/spec.opts
create spec/spec_helper.rb
create stories
create stories/all.rb
create stories/helper.rb
Nếu có project có sẵn, cách làm cũng gần giống tự như trên. Nếu chương trình không dùng ActiveRecord (ví dụ dùng CouchDB như mốt hiện nay), cần theo hướng dẫn ở những dòng đầu của tập tin spec/spec_helper.rb để sửa chút đỉnh.
Test thử cái gì trước?
Theo best practice fat model, thin controller, stupid view, phần lớn code bạn để trong model. Như vậy để bắt đầu, nên viết unit test (RSpec gọi là spec
) cho model trước. Khi đã quen tay, mới dần viết test cho các thứ khác và viết các loại test khác. Tất nhiên đây là cách tiếp cận theo "truyền thống" waterfall (viết chương trình trước, test sau) để bạn làm quen với RSpec, chứ bây giờ bảo bạn viết test trước khi viết chương trình thì bạn bỏ chạy ngay phải không?
Giả sử muốn test model UrlStripper ở app/models/url_stripper.rb:
class UrlStripper
def self.strip(html)
html.gsub(/(.*?)<\/a>/, '\1')
end
end
Ta tạo thư mục spec/models. Ứng với UrlStripper, ta tạo tập tin spec/models/url_stripper_spec.rb:
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe UrlStripper do
it 'should have good stripper' do
input = '<a href="http://mocxi.com/">DIE HARD</a>'
expected_output = 'DIE HARD'
output = UrlStripper.strip(input)
output.should eql(expected_output)
end
end
- Để chạy thử test: rake spec
- Lệnh trên chạy tất cả các test. Để chỉ chạy test trong thư mục spec/model: spec spec/models/*
- Để chỉ chạy một test nào đó thay vì nhiều test cho đỡ mất thời gian (ví dụ khi đang viết thử test): chắc bạn đã đoán ra

- Các lệnh khác: rake -T spec
Làm gì tiếp theo?
Đến đây, cộng thêm kinh nghiệm thu được sau khi đọc chán chê [vân vân và vân vân], chắc bạn đã biết cách viết unit test cho toàn bộ model hiện có hoặc cao hơn là viết spec trước cho model sẽ viết. Sau khi viết unit test cho model quen tay (vì dễ viết nhất), mới nên chuyển qua viết test cho những phần khác.
Để biết cú pháp RSpec, cần đọc tối thiểu 3 tài liệu sau, đều có link ở trang chủ của RSpec:
- Documentation: hướng dẫn chung
- rdoc for rspec: tra cứu API căn bản, ví dụ hàm để kiểm tra đầu ra của hàm có khớp ý muốn hay không
- rdoc for rspec-rails: tra cứu API mở rộng cho Rails
[vân vân và vân vân]: unit test, integration test, acceptance test, exploring test, black box test, white box test, TDD, BDD...
1 2 
172
over 3 years ago
over 3 years ago