Làm quen với RSpec
Bạn đang dùng Rails? Mặc dù Rails đã tích hợp sẵn thư viện để test rất tiện rồi, nhưng bạn nghe nói có thư viện RSpec cho viết test theo phong cách BDD hay hơn nhiều nên muốn thử? Nào ta bắt đầu. Một khi đã bắt đầu được, mọi khúc mắc sẽ dần dần suôn sẻ. Như các bác lãnh đạo vẫn nói, hổng chỗ nào ta ...
Bạn đang dùng Rails? Mặc dù Rails đã tích hợp sẵn thư viện để test rất tiện rồi, nhưng bạn nghe nói có thư viện RSpec cho viết test theo phong cách BDD hay hơn nhiều nên muốn thử? Nào ta bắt đầu. Một khi đã bắt đầu được, mọi khúc mắc sẽ dần dần suôn sẻ. Như các bác lãnh đạo vẫn nói, hổng chỗ nào ta đắp chỗ đó.
Khai báo trong tập tin Gemfile là project cần dùng thư viện rspec-rails:
group :development, :test do gem 'rspec-rails', '~> 3.0' end
Download thư viện:
bundle install
Ngoài thư viện rspec-rails để làm cầu nối giữa RSpec và Rails, thư viện rspec (tức là bản thân RSpec) cũng sẽ được download.
Tạo thư mục spec ta sẽ viết các test viết bằng RSpec vào đấy:
rails generate rspec:install
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. Đây là cách tiếp cận theo "truyền thống" waterfall: viết chương trình trước, test sau. Như vậy là để bạn dễ làm quen với RSpec, còn khi đã quen, hãy thử theo viết test trước, viết chương trình sau, theo tinh thần BDD.
Giả sử muốn test model UrlStripper ở app/models/url_stripper.rb:
class UrlStripper def self.strip(html) html.gsub(/<a .*?>(.*?)</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 'rails_helper' describe UrlStripper do it 'should have good stripper' do input = '<a href="http://kipalog.com/">DIE HARD</a>' expected_output = 'DIE HARD' output = UrlStripper.strip(input) expect(output).to eq(expected_output) end end
bundle exec rspec
Lệnh trên chạy tất cả các tập tin có dạng _spec.rb trong thư mục spec. Để chỉ chạy các test trong thư mục spec/models:
bundle exec rspec 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), ở lệnh trên hãy trỏ đến tận tập tin spec.
Hãy chịu khó đọc tài liệu ở trang chủ của RSpec.