Giới thiệu về Rspec phần 1

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: "[email protected]")
    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: "[email protected]")
    user = User.new(
      firstname: "Bao", lastname: "Hong",
      email: "[email protected]")
    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 "[email protected]" 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: "[email protected]")
    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