Làm quen với Rpec trong Rails
Ở bài viết này mình xin trình bài về Rspec trong Rails. Rails đã tích hợp sẵn thư viện để test rồi. Tuy nhiên viết test theo phong cách BDD (Behavior Driven Development) hay hơn nhiều. Vậy test theo kiểu BDD là gì? Thay vì tập trung vào phát triển phần mềm theo hướng kiểm thử TDD, BDD tập ...
Ở bài viết này mình xin trình bài về Rspec trong Rails.
Rails đã tích hợp sẵn thư viện để test rồi. Tuy nhiên viết test theo phong cách BDD (Behavior Driven Development) hay hơn nhiều. Vậy test theo kiểu BDD là gì? Thay vì tập trung vào phát triển phần mềm theo hướng kiểm thử TDD, BDD tập trung vào phát triển phần mềm theo hướng hành vi. Dựa vào requirement các kịch bản test (Scenarios) sẽ được viết trước dưới dạng ngôn ngữ tự nhiên và dễ hiểu nhất sau đó mới thực hiện cài đặt source code đễ pass qua tất cả các stories đó. Tức là thay vì đợi sản phầm hoàn thành và kiểm tra. Tester sẽ tham gia vào quá trình xây dựng phần mềm với vai trò phân tích và xây dụng hệ thống kịch bản kiểm thử. Vậy liệu rails có gem nào để test như vậy ? Xin thưa là có : rất mạnh là đằng khác đó là : gem 'rspec-rails'
- Để sử dụng được chúng ta cần khai báo gem trong Gemfile
group :development, :test do gem 'rspec-rails', '~> 3.0' end
- sau đó bundle install
- tạo thư mục spec để viết các testcase rails g rspec:install
├── spec │ ├── controllers │ ├── helpers │ ├── models │ ├── rails_helper.rb │ └── spec_helper.rb
Rspec chia các thư mục theo các chức năng tương ứng:
- spec/controllers: test trong controller
- spec/models: test trong model *spec/helpersL test trong helper ...
- connect database Có 2 cách để lấy dữ liệu test từ database: cách 1 thêm config : config/database.yml
test: <<: *default adapter: mysql2 encoding: utf8 database: test username: root password: ' host: 127.0.0.1 port: 3306
cách 2 tạo dữ liệu test thông qua gem Factory_girl_rails:
require 'faker' FactoryGirl.define do factory :user do |f| f.first_name {Faker::Name.name} f.last_name{Faker::Name.name} f.email {Faker::Internet.email} end end
Ở cách 2 bài viết sau mình để cập tới 2 gem Factory và Faker mình sẽ nói cụ thể tới nó. Còn ở bài này mình sẽ config database.yml rồi tạo dữ liệu từng bước một
Chúng ta được biết phần lớn code được viết trong model chúng ta sẽ bắt đầu bằng việc viết rspec trong model trước. app/models/user.rb
class User validates :first_name, last_name, email, presence: true end
spec/models/user_spec.rb
require 'rails_helper' describe User do it "is valid with a first name, last name, and email" do user = User.new( first_name: "First" last_name: "Last" email: first_last@email.com") expect(user).to be_valid end it "is not valid with first name, last name, email ís nil" do user = User.new expect(user).to have(1).errors_on(:firstname) end end
OK. vậy là đã viết xong 2 test case cho phần test validate khi tạo User. Bạn có thể chạy rspec bằng câu lệnh: bundle exec rspec Lệnh trên sẽ chạy tất cả các tập tin có dạng _spec.rb trong thư mục spec. Để chạy test trong thư mục models: bundle exec rspec spec/models
Phần trên là việc test validate trong model cơ bản mình mình muốn các bạn làm quen dần dần với rspec để viết test. Dưới đây là phần viết rspec cơ bản với controlller app/controllers/user_controller.rb
def new @user = User.new end def create @contact = User.new user_params if @user.save redirect_to @user else render :new end end end private def user_params params.require(:user).permit :first_name, last_name, :email end
spec/controllers/user_controller_spec.rb
require 'rails_helper' RSpec.describe UsersController, type: :controller do describe "POST #create" do context "with valid attributes" do it "create new contact" do post :create, user: {first_name: 'first', last_name: 'last', email: 'first_name@gmail.com'} expect(User.count).to eq(1) end end end end
OK. Và chúng ta chạy test thử xem nào bundle exec rspec spec/controllers/user_controllers_spec.rb
Bài viết này mình chỉ mới hướng dẫn các bạn về gem rspec-rails. Cũng như là làm quen cách viết spec. Cũng khá đơn giản phải không nhỉ. Bài viết sau mình sẽ nói đến các gem hỗ trợ và cách dùng của nó cho việc viết rspec: VD: gem shoulda-matchers : giúp việc test dễ dàng hơn và dễ đọc hơn gem database_cleaner: trước khi chạy rspec sẽ rollback database, đảm bảo việc database luôn nhất quán trong suốt quá trình chạy test gem factory_girl_rails : tạo giữ liệu giả , ngẫu nhiên phục vụ cho việc test gem faker: tạo các object với giá trị ngẫu nhiên...
Hẹn gặp lại mọi người trong bài viết sau. Mọi người có thể tham khảo tại : http://rspec.info/documentation/ Cảm ơn mọi người đã theo dỗi bài viết.