0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Hướng Dẫn Chi Tiết Viết Unit Test Trong Rails Sử Dụng RSpec (Phần 2)

Đăng vào 3 tuần trước

• 5 phút đọc

Hướng Dẫn Chi Tiết Viết Unit Test Trong Rails Sử Dụng RSpec (Phần 2)

Trong phần trước, mình đã có dịp giới thiệu về RSpec và một số gem hỗ trợ trong ứng dụng Rails. Trong bài viết này, mình sẽ đi sâu vào các thành phần cơ bản và cách tổ chức test case khi làm việc với RSpec.

Sử Dụng describe, context, và it

Trong RSpec, các phương thức describe, context, và it giúp bạn viết và tổ chức các test case một cách rõ ràng, mang lại sự dễ đọc và dễ hiểu cho mã nguồn.

1. describe

describe được sử dụng để nhóm các test case liên quan dưới một tiêu đề chung, thường mô tả một đối tượng, class, hoặc phương thức mà bạn đang kiểm tra:

Copy
describe 'Tên đối tượng hoặc phần của mã nguồn cần kiểm tra' do
  # Các test case sẽ được định nghĩa ở đây
end

2. context

context được sử dụng để mô tả các trạng thái hoặc điều kiện mà đối tượng hoặc phương thức đang kiểm tra có thể gặp phải:

Copy
context 'Khi điều kiện hoặc trạng thái nhất định xảy ra' do
  # Các test case sẽ được định nghĩa ở đây
end

3. it

it được dùng để mô tả một test case cụ thể, nêu rõ điều kiện kiểm tra và kết quả mong đợi:

Copy
it 'Mô tả điều kiện cần kiểm tra' do
  # Mã kiểm tra sẽ được định nghĩa ở đây
end

Thứ tự tổ chức thường theo chuẩn describe -> context -> it, như ví dụ dưới đây:

Copy
describe 'Kiểm tra thực thể User' do
  context 'Khi tạo một người dùng mới' do
    it 'hợp lệ với thuộc tính hợp lệ' do
      # Kiểm tra tính hợp lệ của user khi tạo mới
    end

    it 'không hợp lệ nếu thiếu tên' do
      # Kiểm tra user không hợp lệ nếu thiếu thuộc tính name
    end
  end

  context 'Khi cập nhật một người dùng đã tồn tại' do
    it 'cập nhật thuộc tính của người dùng' do
      # Kiểm tra cập nhật thuộc tính của user thành công
    end

    it 'không cho phép thuộc tính không hợp lệ' do
      # Kiểm tra user không được cập nhật nếu dữ liệu mới không hợp lệ
    end
  end
end

Sử Dụng let, let!, before, và subject

Các phương thức này giúp bạn thiết lập trạng thái ban đầu và các biến trong các test case, làm cho mã RSpec của bạn trở nên rõ ràng và dễ hiểu hơn.

1. let

let được sử dụng để định nghĩa một biến instance trong phạm vi của một describe hoặc context. Biến này chỉ được khởi tạo khi được gọi đến lần đầu:

Copy
describe User do
  let(:user) { User.new(name: 'John', email: 'john@example.com') }

  it 'có tên' do
    expect(user.name).to eq('John')
  end

  it 'có email' do
    expect(user.email).to eq('john@example.com')
  end
end

2. let!

Tương tự như let, nhưng biến let! sẽ được khởi tạo ngay khi describe hoặc context được gọi:

Copy
describe User do
  let!(:user) { User.create(name: 'John', email: 'john@example.com') }

  it 'có tên' do
    expect(user.name).to eq('John')
  end

  it 'có email' do
    expect(user.email).to eq('john@example.com')
  end
end

3. before

before được dùng để thiết lập trạng thái ban đầu trước khi mỗi test case chạy:

Copy
describe User do
  before do
    @user = User.new(name: 'John', email: 'john@example.com')
  end

  it 'có tên' do
    expect(@user.name).to eq('John')
  end

  it 'có email' do
    expect(@user.email).to eq('john@example.com')
  end
end

4. subject

subject được dùng để định nghĩa một biến instance mặc định cho các test case, giúp loại bỏ sự lặp lại:

Copy
describe User do
  subject { User.new(name: 'John', email: 'john@example.com') }

  it 'có tên' do
    expect(subject.name).to eq('John')
  end

  it 'có email' do
    expect(subject.email).to eq('john@example.com')
  end
end

Bạn cũng có thể đặt tên cho subject, ví dụ:

Copy
describe User do
  subject(:custom_user) { User.new(name: 'Jane', email: 'jane@example.com') }

  it 'có tên' do
    expect(custom_user.name).to eq('Jane')
  end

  it 'có email' do
    expect(custom_user.email).to eq('jane@example.com')
  end
end

Mocking và Stubbing

Các kỹ thuật này giúp giả lập hoặc thay thế các thành phần phụ thuộc trong mã nguồn để kiểm tra chức năng một cách độc lập.

1. Stubbing

Giả sử bạn có một classCalculator`, chúng ta có thể thực hiện stubbing như sau:

Copy
allow(some_object).to receive(some_method).and_return(some_value)

2. Mocking

`
Sử dụng mocking nhằm kiểm tra các sự mong đợi khi gọi đến một phương thức:

Copy
expect(some_object).to receive(some_method).and_return(some_value)

Sử Dụng Factory Bot Hiệu Quả

Factory Bot là thư viện giúp tạo dữ liệu mẫu cho test case một cách linh hoạt.

1. Cơ Bản Về Factory Bot

Factory Bot giúp bạn tạo ra các đối tượng và dữ liệu một cách tự động.

2. Nâng Cao Với Factory Bot

  • Sử dụng Traits: Định nghĩa các thuộc tính và hành vi đặc biệt cho các factory để tạo ra các phiên bản khác nhau của cùng một đối tượng dễ dàng hơn.

  • Kết hợp với Faker: Tạo dữ liệu giả mạo phong phú, giúp kiểm tra đáng tin cậy hơn.

3. Ví Dụ Sử Dụng Factory Bot

ruby Copy
# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { Faker::Name.name }
    email { Faker::Internet.email }
    password { Faker::Internet.password }

    trait :admin do
      admin { true }
    end
  end
end

Kết Luận

Bài viết trên đã trình bày các kiến thức cần thiết để thực hiện unit testing trong Rails sử dụng RSpec. Hy vọng rằng những chia sẻ trên sẽ giúp ích cho bạn khi bắt đầu phát triển dự án với Ruby on Rails.

Tài Liệu Tham Khảo

Hướng Dẫn RSpec Mocks | Martin Fowler - Mocks Aren't Stubs
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào