Tôi đã test một Rails Application như thế nào? (Cài đặt RSpec)
Tiếp tục phần 2 của series "Tôi đã test một Rails Application như thế nào". Mình rất vui khi nhận được nhiều phản hồi tích cực từ bạn đọc, và sẽ cố gắng hoàn thành series này và mong nó sẽ giúp ích được cho các bạn nhiều hơn. Ở trong phần 2 này chúng ta sẽ cùng nhau hoàn thành 1 số phần sau: Sử ...
Tiếp tục phần 2 của series "Tôi đã test một Rails Application như thế nào". Mình rất vui khi nhận được nhiều phản hồi tích cực từ bạn đọc, và sẽ cố gắng hoàn thành series này và mong nó sẽ giúp ích được cho các bạn nhiều hơn. Ở trong phần 2 này chúng ta sẽ cùng nhau hoàn thành 1 số phần sau:
- Sử dụng Bundler để cài đặt RSpec và một số gem cần dùng trong việc testing
- Tạo một database test, nếu cần
- Config RSPec
- Config Rails application có thể tự động generate files để có thể test mỗi khi chúng ta thêm một feature mới
Ví dụ
Trong bài viết này chúng ta sẽ giả định một application sẽ có feature sau đây
- Mọi người có thể xem được contacts' information
- User cần login để có thể thêm contact
- Contact có thể sẽ có nhiều số điện thoại, thông qua việc sử dụng nested form attributes
Gemfile
Điều đầu tiên, RSpec không được include vào trong Rails, nên chúng ta cần phải cài đặt nó. Chúng ta có thể sử dụng Bundler để các dependency. Trong application, mở Gemfile và thêm đoạn code sau
group :development, :test do gem 'rspec-rails' gem 'factory_girl_rails' end group :test do gem 'faker' gem 'capybara' gem 'guard-rspec' gem 'launchy' end
Tại sao tôi lại chia làm 2 groups? rspec-rails và factory_girl_rails sẽ được sử dụng ở trong cả 2 môi trường development lẫn test. Đặc biệt là, tôi sử dụng chúng trong môi trường development để có thể generate một số thành phần một cách nhanh chóng. Những Gem còn lại sẽ chỉ được sử dụng khi bạn chạy specs, nó không cần thiết để load trong môi trường development. Tôi cũng chắc chắn rằng nhưng Gem này sẽ chỉ generating code hoặc chạy test chứ không được cài đặt trên môi trường production khi bạn deploy lên server.
Chạy bundle trong command line để cài đặt gem vào system $ bundle
Vậy sao ta lại phải cài đặt nó? rspec-rails bao gồm RSpec được gán vào ngay từ đầu factory_girl_rails thay thế Rails’ default fixtures để tạo data test, một cách đơn giản và nhanh chóng hơn rất là nhiều faker dùng để generates names, email addresses, và một số factory khác (bạn có thể tham khảo trên trang github của faker) capybara dùng để việc code được dễ dàng hơn, khi giả lập các users' interactions ở trong app của bạn launchy Dùng để tránh lỗi, dễ dàng hiển thị khi có lỗi trong lúc application đang rendering guard-rspec kiểm soát app của bạn và chạy test theo specs một cách tự động khi nhận ra có sự thay đổi Tôi sẽ đề cập chi tiết hơn trong các bài viết tới, nhưng trong lúc chờ đợi bạn có thể cài như bình thường. Tiếp đến là tạo database test
Test database
Nếu bạn add thêm specs vào 1 Rails application thì bạn rất may mắn vì thường hiếm ng dùng gửi cho bạn cả 1 database trong hệ thống trong bài viết này mình sử dụng SQL Lite
test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 timeout: 5000
Hoặc nếu bạn sử dụng MySQL
test: adapter: mysql2 encoding: utf8 reconnect: false database: myapp_test pool: 5 username: root password: socket: /tmp/mysql.sock
Nếu không phải, bạn có thể add code trực tiếp vào file database.yml
Cuối cùng để chắc chắn rằng bạn có có một database kết nối thông suốt, chúng ta cần phải chạy câu lệnh rake task
$ rake db:create:all
Và bây giờ chúng ta sẽ tiếp tục config RSpec
RSpec configuration
Bây giờ, chúng ta có thể thêm spec folder vào trong thư mục dự án. Ở trong command line, install RSpec như sau:
$ rails g rspec:install
Dựa theo một file report được generate, chúng ta có một file config của RSpec (.rspec), một folder bao gồm toàn bộ các spec files mà có thể chúng ta đã tạo trước đó, và file helper dùng để customer cách RSpec sẽ làm việc và tương thích với code của mình. Nào hãy cùng nhau customize nào:
Đầu tiên, chúng ta sẽ bắt đầu bằng việc thêm Capybara, Mở file vừa mới create spec/spec_helper.rb, sau đó chúng ta thêm
require "capybara/rspec"
Tiếp theo, cái này không bắt buộc phải làm. Tôi muốn thay đổi RSpecs' output từ default format sang một format dễ đọc hơn. Điều đó sẽ khiến cho việc theo dõi spec nào đã pass, spec nào đã fail trở nên dễ dàng hơn rất là nhiều. Chúng cũng cung cấp một outline rất dễ theo dõi. Mở file .rspec và thêm vào dòng sau
--format documentation
Một bước nữa, thông báo với Rails sẽ generate spec file cho chúng ta
Generators
Bây giờ chúng ta đã cài đặt xong RSpec và config thành công, hãy bắt đầu sử dụng Rails để generate fle khởi động cho app. Trong khi đó, tôi sẽ mở config/application.rb và thêm vào dòng code dưới đây vào Application class:
config.generators do |g| g.test_framework :rspec, :fixtures => true, :view_specs => false, :helper_specs => false, :routing_specs => false, :controller_specs => true, :request_specs => true g.fixture_replacement :factory_girl, :dir => "spec/factories" end
Bạn có thể đoán ra dòng code trên sẽ làm gì không? :fixtures => true: xác định tạo ra một fixture cho mỗi model (Sử dụng Factory Girl factory, thay thế cho model cụ thể) :view_specs => false skip generating specs; thay vào đó chúng ta sẽ sử dụng các thông số yêu cầu để kiểm tra các phần tử giao diện. :helper_specs => false skips generating specs cho helper files khi Rails generates cho mỗi controller. Khi làm việc thành tạo bạn có thể đổi thành true để có thể kiểm tra được các file đó :routing_specs => false bỏ qua một spec file cho config/routes.rb. Nếu application của bạn đơn giản, bạn có thể bỏ qua bước này (như application trong series này) còn với các ứng dụng có nhiều routing phức tạp thì nên có thêm phần spec routing và cuối cùng g.fixture_replacement :factory_girl Rails sẽ generate factories thay vì fixtures, và sẽ save chúng vào thư mục spec/factories.
App của chúng ta bây giờ đã được config với RSpec, bây giờ là lúc để viết các function và bắt đầu thêm các testcase cho model
Trong bài viết tới mình sẽ hướng dẫn bạn có thể viết RSpec cho model: