Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Bắt đầu với RSpec 1402

ngocdaothanh.myopenid.com 172
Updated 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ì{#emotions_dlg.sealed}

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{#emotions_dlg.laughing}) 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?{#emotions_dlg.tongue_out}

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{#emotions_dlg.tongue_out}
  • 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 

Editors
tnd.myopenid.com 17
ngocdaothanh.myopenid.com 172

Comments

akia.myopenid.com 6
over 3 years ago

Đây cũng là bug?

Bài này chỉ thuộc 1 category Ruby nhưng mục Category hiện ra 2 chữ "Ruby, Ruby"

ngocdaothanh.myopenid.com 172
over 3 years ago

Đấy là lỗi trùng lặp dữ liệu trong DB. Khi nâng cấp từ phiên bản cũ, phải chuyển đổi dữ liệu cũ cho khớp với schema mới. Có lẽ khi chuyển đổi bị sai sót.

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content