11/08/2018, 21:14

Giới thiệu hàm aggregate_failures() trong RSpec

Test framework của RSpec luôn làm tôi bất ngờ với nhiều hàm dường như rất ít được biết đến nhưng khá là hữu dụng. Hôm nay trong khi phỏng vấn một ứng cử viên cho vị trí junior dev tại cty, tôi học lỏm được hàm expectation tên #aggregate_failures. Vậy hàm này là gì? Dùng cho trường hợp nào. ...

Test framework của RSpec luôn làm tôi bất ngờ với nhiều hàm dường như rất ít được biết đến nhưng khá là hữu dụng. Hôm nay trong khi phỏng vấn một ứng cử viên cho vị trí junior dev tại cty, tôi học lỏm được hàm expectation tên #aggregate_failures.

Vậy hàm này là gì? Dùng cho trường hợp nào.

Hàm này được sử dụng để nhóm nhiều assertion lại với nhau và nếu một trong assertion bị fail thì cho ra thống nhất một exception. Lấy vd nhé:

# kiểm tra xem request có oke không
expect(response.status).to eq(200)

# kiểm tra request
expect(response.headers).to include("Content-Type" => "text/plain")

# xem body có từ khoá Success
expect(response.body).to include("Success")

ví dụ trên là một ví dụ phổ biến được thấy nhiều trong API app, và thường là được tách ra làm 3 example rõ ràng, nhưng tôi muốn gộp 3 cái assertion đấy lại thành một thì tôi có thể làm như sau:

aggregate_failures('invalid request') do
  expect(response.status).to eq(200)
  expect(response.headers).to include("Content-Type" => "text/plain")
  expect(response.body).to include("Success")
end

điều này nghĩa là nếu một trong cái assertion trên có vấn đề thì test của tôi không bị gián đoạn (tiếp tục chạy tiếp cái assertion tiếp theo). Nếu chỉ có 1 assertion bị fail thì nó quăng Expectations::ExpectationNotMetError, còn nếu có trên 1 assertion bị fail thì nó quăng Expectations::MultipleExpectationsNotMetError.

Lợi ích của hàm này nó giúp nhóm nhiều assertion lại thành 1, thuận tiện cho việc chia sẻ và đồng thời cũng giúp giảm thời gian chạy test trong một số app mà phần thiết lập môi trường test mất thời gian so với cách thức chia các assertion chạy riêng biệt trong từng example.

Còn muốn tìm hiểu thêm nữa thì các bạn cứ gốc-gồ là ra API :)

0