Viết unit test với rspec trong Rails (P1)

Tram Ho

Phần 1: Giới thiệu về test double và cách sử dụng trong RSpec

Test double là gì ?

Test Double là một thuật ngữ chung cho bất kỳ trường hợp nào bạn thay thế một đối tượng được sử dụng thực tế cho mục đích kiểm thử.

Mục đích chính của test double là làm giảm sự phụ thuộc và tăng tính độc lập của các test case. Việc này vô cùng quan trọng trong unit test vì chúng ta đều mong muốn test case chạy nhanh, độc lập và ít phụ thuộc vào các “unit” khác nhất có thể.

Martin Fowler định nghĩa test double ra làm 5 loại khác nhau tùy thuộc vào mục đích sử dụng:

  • Dummy: các đối tượng được truyền vào nhưng không bao giờ thực sự được sử dụng. Thông thường chúng chỉ được sử dụng để lấp đầy vào danh sách tham số.
  • Fake: các đối tượng thực sự có triển khai hoạt động, nhưng không được lưu trữ như trong thực tế (InMemoryTestDatabase là một ví dụ điển hình).
  • Stubs: các đối tượng chứa dữ liệu được xác định trước và sử dụng nó để trả lại dữ liệu khi call đến những method nhất định.
  • Spies: các đối tượng cho phép ghi lại cách mà nó hoạt động như số lần được gọi, tham số nhận vào, …
  • Mocks: cũng giống như stub có thể trả về những dữ liệu cho trược nhưng kèm theo yêu cầu là phải verify action đấy được gọi trong test case.

Dummy

Thường được sử dụng để lấp đầy tham số của một hàm trong những case mà tham số đấy không được sử dụng nhằm tăng tốc test case.

Một ví dụ trong Rspec:

Fake

Thường ít được sử dụng trong unit test, tuy nhiên bạn có thể tìm hiểu thêm về InMemoryTestDatabase tại đây

Stubs

Sử dụng để fake kết quả trả về của một hàm mà mình không thực sự muốn chạy hàm đó. Trong rails mình thường sử dụng để stub những model callback không cần thiết trong test case đặc biệt là các callback tác động vào database hay elasticsearch …

Rspec cung cấp cú pháp để stub method của một object như sau:

hoặc có thể dùng cách viết tắt sau:

Một ví dụ về sử dụng stub trong Rspec:

Spies

Sử dụng để verify những hành động trong method như ghi log, bắn noti,…
Chúng ta có thể verify method được gọi mấy lần, với tham số nào, …Cú pháp để sử dụng spy trong Rspec:

Một ví dụ sử dụng spies trong Rspec:

Mock

Theo mình thấy thì mock khá giống stub + spies kết hợp lại. Cú pháp sử dụng mock trong Rspec:

Một ví dụ sử dụng mock trong rspec:

Tài liệu tham khảo

https://jmauerhan.wordpress.com/2018/10/04/the-5-types-of-test-doubles-and-how-to-create-them-in-phpunit/

https://www.martinfowler.com/articles/mocksArentStubs.html

https://martinfowler.com/bliki/TestDouble.html

https://rubydoc.info/gems/rspec-mocks/frames

https://blog.pragmatists.com/test-doubles-fakes-mocks-and-stubs-1a7491dfa3da

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo