Giới thiệu về Rspec phần 1
Bài đăng này đã không được cập nhật trong 8 năm
Giới thiệu về Rspec
đôi lời về bài viết: Bài viết dược với mục đích giới thiệu về Rspec, nên sẽ được sắp xếp sao cho dễ tiếp cận với người đọc nhất.
Sơ lược về Rspec
Rspec là gì?
Rspec là một testing framework dành cho Ruby, bên cạnh những testing framwork khác, Rspec được biết đến và sử dụng bởi cú pháp dễ đọc. Rspec có thể đọc và hiểu bởi những người có ít kiến thức về lập trình nhất. Nó kiến cho việc giao tiếp giữa lập trình viên, tester, và ngay cả khách hàng trở nên dễ dàng hơn.
Cài đặt Rspec
Để cài đặt Rspec ta sử dụng gem "rails-spec" Gemfile mẫu:
ruby
group :development, :test do
gem "rspec-rails"
gem "factory_firl_rails"
end
group :test do
gem "faker"
gem "capybara"
gem "database_cleaner"
gem "launchy"
gem "selenium-webdriver"
end
Tại sao lại phải chia làm hai group khác nhau?
rspec-rails và factory_girl_rails được sử dụng trong cả hai môi trường development và test, trong khi các gem còn lại như faker chỉ dùng trong môi trường test, chính vì thế, ta chia ra làm hai group, để đảm bảo các gem chỉ sử dụng trong môi trường test không được cài đặt ở môi trường development.
Model Specs
Theo ý kiến chủ quan của tôi, việc viết test cho model là phần nên được thực hiện trước tiên và cũng làm phần quan trọng nhất, vì nó giúp cho việc đảm bảo các ràng buộc logic cho ứng dụng web của chúng ta cũng như kiểm tra tính đúng đắn của các method ta đã viết.
Ta hãy làm quen với Rspec ví dụ Rspec cho model User dưới đây:
ruby
describe User do
it "is valid, with a firstname, lastname, and email"
it "is invalid without a firstname"
it "is invalid without a lastname"
it "is invalid without an email"
it "is invalid with duplicate email"
it "return a user's full name as a string"
end
Chúng ta sẽ giải thích đôi chút về những gì đã viết bên trên:
-
"describe" cho biết rằng chúng ta sẽ mong đợi điều gì từ một file Rspec, như ở đây thì ta đang mong đợi các mô tả về model User
-
"it" chỉ ra rằng chúng ta mong đợi một hành động nào đó, ở đây, với mỗi dòng test, chúng ta kì vọng việc sẽ phát hiện ra sự có mặt của mỗi mõi thuộc tính của object user nào đó sẽ là valid hay invalid.
-
Nên chú ý mỗi test case của chúng ta được bắt đầu bằng một động từ chứ không phải một danh từ
chúng ta hãy thử nghiệm những gì mình vừa viết bằng cách chạy command
"bundle exec rspec" từ terminal
Bạn đã nhìn thấy gì nhỉ? Tất nhiên rồi, tất cả các test case của chúng ta đều đang pending! Đơn giản là bởi vì ta mới viết các mô tả cho các test case mà thôi )
Bắt đầu việt Rspec một cách thực thụ
Hãy sửa lại file spec của bạn như sau:
ruby
describe User do
it "is valid with a firstname, lastname, and email" do
user = User.new(
firstname: "Tho"
lastname: "Bay Mau"
email: "thobaymau@email.com")
expect(user).to be_valid
end
Ồ, chúng ta vừa viết gì thể nhỉ? đây là một test case thực thụ cho model User, ta dễ dàng nhận ra rằng ta đã khởi tạo một object user với các thuộc tính firstname, lastname, email.
Còn sau đó? Hàm expect(user) cho biết bạn kì vọng object user bạn vừa khởi tạo trên kia sẽ thỏa mãn điều sau đó chính là "be_valid"
Ez phải không nao?
Cùng bắt tay viết tiếp các test case tiếp theo nào!
ruby
it "is invalid without a firstname" do
user = User.new
expect(user).to have(1).errors_on(:firstname)
end
Chúng ta vừa làm gì thế nhỉ, ta lại khởi tạo mộ object user, nhưng lần này ta không hề gán giá trị nào cho user hết, và lại hàm expect. nhưng lần này điều ta kì vọng là nhận được một lỗ ở trường firstname bạn hãy thử chạy "bundle exec rspec" để nhận thành quả nhé!
Sau đó bạn có thể viết tiếp file spec ban đầu của chúng ta theo hai ví dụ trên đây!
Đừng quên "bundle exec rspec" nhé
Quay lại với test case email
ruby
it "is invalid with a duplicate email" do
User.create(
firstname: "Tho", lastname: "Bay Mau",
email: "thobaymau@email.com")
user = User.new(
firstname: "Bao", lastname: "Hong",
email: "thobaymau@email.com")
expect(contact).to have(1).errors_on(:email)
Chú ý rằng ở đây t vừa create và vừa new bởi ta cần phải create thì mới tồn tại user với email "thobaymau@email.com" sau đó mới có thể phát, hiện lỗi khi ta tạo thêm một user với cùng email.
Test case cuối cùng ljlnào!
ruby
it "retủn a user's fullname as a string" do
user = User.new(
firstname: "Tho",
lastname: "Bay Mau"
email: "thobaymau@email.com")
expect(user.name).to eq "Tho Bay Mau"
end
Ta vừa làm gì nhỉ, khác với các test case trước, các test case trước dây, ta tập trung vào validates và tính duy nhất với email, nhưng trong ví dụ này, ta sử dụng rspec để kiểm tra một thuộc tính ảo(virtual attribute) của object user là name. Nó cũng tuơng tự như việc ta test một method của model.
Phần tiếp theo spec cho class method, scope và sử dụng factory
All rights reserved