Viết Unit Test cho API sử dụng URLProtocol

by TienVV8
134 views

Hi mọi người, Chắc hẳn các bạn đã từng làm những dự án yêu cầu viết Unit Test, UI Test. Về cơ bản thì UT là một cách verify lại logic mình viết ra. Tuy nhiên đối với việc viết UT cho API thì việc verify logic lại gặp khó khăn vì kết quả của API phụ thuộc vào Server.

Bài này mình sẽ giới thiệu về Mock Network cho việc viết UT.

Bắt đầu thôi!!!

Đầu tiên chúng ta tìm hiểu URLProtocol là gì

Định nghĩa

URLProtocol là một abstract class xử lý việc tải dữ liệu URL dành riêng cho protocol-specific.
Mỗi khi URL Loading System nhận được yêu cầu load 1 URL, nó sẽ tìm kiếm trình xử lý giao thức đã đăng ký để xử lý yêu cầu. Mỗi trình xử lý cho hệ thống biết liệu nó có thể xử lý một yêu cầu đã cho thông qua phương thức canInit(with request: URLRequest) của nó hay không?
Tham số cho phương thức này là yêu cầu giao thức được hỏi nếu nó có thể xử lý. Nếu phương thức trả về true, thì hệ thống tải sẽ dựa vào lớp con URLProtocol này để xử lý yêu cầu và bỏ qua tất cả các trình xử lý khác.

Custom URLProtocol

Ở đây mình tạo ra một class URLProtocolMock và kế thừa URLProtocol và override các method như sau:

  • mothod canInit() được gọi để kiểm tra xem Giao thức có thể xử lý loại yêu cầu nhất định hay không.
  • nếu canInit là true, sau đó canonicalRequest() được gọi và chúng ta trả ra đúng request hiện tại
  • Sau đó đến phần tiếp nạp. startLoading() sẽ làm tất cả những gì có thể để tìm nạp nội dung, stopLoading() có thể được gọi để hủy hoặc đánh dấu hoàn thành.

Bây giờ đến việc viết UT cho một function call API, để viết được UT cho function call API thì chúng ta cần có function call API. Mình sử dụng URLSession để thực hiện call một API đơn giản
API: https://postman-echo.com/get?test=123
Method: GET

Unit Test cho Network

Tiếp theo mình tạo ra class NetworkServiceTests để viết test cho NetworkServices

  • setUpWithError() mothod này được chạy trước khi thực hiện một test case. Ở đây mình mình setup cho URLSession set configuration.protocolClasses = [URLProtocolMock.self] để thực hiện proccess lấy data từ custom URL Protocol đã tạo ở trên
  • tearDownWithError() mothod này được chạy mỗi khi hoàn thành một test case. Vì mình không cần release gì ở đây nên mình không code gì thêm cho nó.

Sau khi config cho class test, Mình viết một test case cho trường hợp requestPostmanEcho success

Lưu ý: khi đặt tên test case thì bắt buộc phải có prefix là “test” nhé, ở đây mình đặt tên test case này là test_requestPostmanEcho_success()

  • line 30-33: tạo ra response mong muốn
  • line 35-38: config response và jsonData cho request

Vì đã config statusCode 200 nên request requestPostmanEcho trả ra kết quả thành công với response là một dictionary. Mình lấy kết quả trả ra và so sánh với giá trị mong muốn. Tất nhiên là thành công rồi!!!

Mình sẽ viết thêm một test case nữa, Lần này mình vẫn config response thành công (statusCode: 200) tuy nhiên ở jsonString mình sẽ config thành một dạng không phải là json. Lúc này khi gọi đến requestPostmanEcho thì sẽ nhận được kết quả là error responseFailed.

Mình so sánh kết quả nhận được từ request với kết quả mong muốn là responseFailed. Tất nhiên là nó cũng sẽ thành công rồi

Trong ví dụ call API của mình thì có một xử lý riêng cho statusCode 404 NotFound. Các bạn cũng có thể viết một test case cho lỗi 404 này và tất nhiên là phải config statusCode về 404 cho test case đó.

Trên đây mình đã giới thiệu đến các bạn cách viết UT cho API sử dụng URLProtocol. Từ đây các bạn có thể tuỳ biến cho dự án của mình.

Mình hi vọng bài viết có thể giúp ích được cho các bạn. Chúc các bạn thành công!

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.