12/08/2018, 16:10

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'

  1. Để 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
  1. sau đó bundle install
  2. 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 ...
  1. 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.

0