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:
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:
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:
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:
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:
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:
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:
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:
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ụ:
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 class
Calculator`, chúng ta có thể thực hiện stubbing như sau:
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:
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
# 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