Tìm hiểu về rspec trong rails

Tổng quan về Rspec

Rspec là gì

  • rspec là một gem rất mạnh trong ruby on rails nhằm mục đích kiểm thử các chức năng được viết bởi ruby on rails

tại sao sử dụng rspec

  • rspec có cú pháp rất ngắn gọn, dễ đọc dễ viết
  • Test result dễ đọc
  • hỗ trợ việc viết testkey tiện lợi.

Cách cài đặt

  • Install gem install rspec-rails
  • config: Thêm rspec-rails vào group: :test và :development trong Gemfile
group :test, :development do
  gem 'rspec-rails', '~> 3.0.0'
end
  • run bundle install
  • sau khi cài đặt rspec ta sẽ có cấu trúc thư mục như sau:

rspec.png

-- controller : nơi chứa các file test controller

-- model : chưas các file test model

-- factories : nơi chứa dữ liệu giả dùng trong quá trình test

connect database

  • cách 1: lấy dữ liệ test từ databse. chỉnh sửa file: config/database.yml
test:
  adapter: mysql2
  encoding: utf8
  database: fels_db
  username: root
  password: ''
  host: 127.0.0.1
  port: 3306
  • cách 2: tạo dữ liệu test qua dữ liệu dữ liệu giả sử dụng FactoryGirl
    • ví dụ: tạo dữ liệu ảo để test model
require 'faker'
FactoryGirl.define do
  factory :user do |f|
    f.name {Faker::Name.name}
    f.email {Faker::Internet.email}
    f.password {"foobar"}
    f.password_confirmation {"foobar"}
  end
end

### cấu trúc
```RUBY

describe MyClass do
  describe ".class_method" do
    ...
  end

  describe "#instance_method" do
    ...
  end
end

Cú pháp cơ bản

  • ví dụ:

    let(:category) {FactoryGirl.create :category}

    subject {category}

    describe "validates" do
        context "create is valid" do
        it {is_expected.to be_valid}
    end

    context "when name is not valid" do
      before {subject.name = ""}
      it {is_expected.not_to be_valid}
    end

    context "when name is too long" do
      before {subject.name = Faker::Lorem.characters(55)}
      it {is_expected.not_to be_valid}
    end
  end

  • **describe ** : dùng để miêu tả chung cho 1 nhóm các test

describe 'test tong' do
  it '5 + 5 bang 10' do
    expect(5 + 5).to eq 10
  end
  it '5 + 6 khac 10' do
    expect(5 + 6).to_not eq 10
end

  • context : cũng dùng để miêu tả cho một nhóm các test key nhưng dùng để phân nhánh test key theo từng trường hợp.

describe "validates" do
    context "create is valid" do
    it {is_expected.to be_valid}
end

  • it : dùng để mô tả test key.

    it {is_expected.to be_valid}

  • before dùng để nhóm các thao tác chung như tạo dữ liệu
  • let : dùng để khởi tạo object

let(:category) {FactoryGirl.create :category}

  • subject : xác định đối tượng object trong test key

    let(:category) {FactoryGirl.create :category}

    subject {category}
    context "when name is too long" do
      before {subject.name = Faker::Lorem.characters(55)}
      it {is_expected.not_to be_valid}
    end
  end

-- trong ví dụ trên. sau khi qua before thì subject đã chuyển từ category thành category.name

  • is_expected.not_to be_valid : hàm này có ý nghĩa kiểm tra xem đối tượng có qua được validate hay không

Matcher

  • eq là phép so sánh bằng.
  • **be_xxx ** là đặc trưng cho các matcher được kết thúc bằng ?. vs: be_empty, be_valid, ...
  • be_truthy / be_falsey trả về giá trị true or false
  • raise_errorcó thể kiểm tra được cả những lỗi phát sinh
  • include kiểm tra xem 1 phần tử có nằm trong 1 mảng hay không
  • be_within(Y).of(X) :giá trị trả về
  • nằm trong khoảng X-Y đến X+Y

tư liệu tham khảo