Trước khi trả lời một câu hỏi như vậy, bạn cần phải quyết định những gì bạn thực sự muốn đạt được.
Bạn viết mã. Bạn hy vọng nó hoàn thành hợp đồng của mình (nói cách khác, nó thực hiện những gì nó phải làm. Viết ra những gì nó phải làm là một bước tiến khổng lồ đối với một số người).
Để được thuyết phục một cách hợp lý rằng mã thực hiện những gì nó phải làm, bạn sẽ nhìn chằm chằm vào nó đủ lâu hoặc bạn viết mã kiểm tra để kiểm tra đủ các trường hợp để thuyết phục bạn "nếu mã vượt qua tất cả các thử nghiệm này thì đó là chính xác".
Thường thì bạn chỉ quan tâm đến giao diện được xác định công khai của một số mã. Nếu tôi sử dụng thư viện của bạn, tôi không quan tâm làm thế nào bạn đã làm cho nó hoạt động chính xác, duy nhất mà nó không hoạt động chính xác. Tôi xác minh rằng thư viện của bạn là chính xác bằng cách thực hiện các bài kiểm tra đơn vị.
Nhưng bạn đang tạo thư viện. Làm cho nó hoạt động chính xác có thể khó đạt được. Giả sử tôi chỉ quan tâm đến thư viện thực hiện thao tác X một cách chính xác, vì vậy tôi có một bài kiểm tra đơn vị cho X. Bạn, nhà phát triển chịu trách nhiệm tạo thư viện, thực hiện X bằng cách kết hợp các bước A, B và C, mỗi bước hoàn toàn không cần thiết. Để thư viện của bạn hoạt động, bạn thêm các bài kiểm tra để xác minh rằng A, B và C từng hoạt động chính xác. Bạn muốn những bài kiểm tra này. Nói rằng "bạn không nên có các bài kiểm tra đơn vị cho các phương thức riêng tư" là khá vô nghĩa. Bạn muốn thử nghiệm cho các phương pháp riêng tư này. Có thể ai đó nói với bạn rằng đơn vị thử nghiệm phương pháp riêng tư là sai. Nhưng điều đó chỉ có nghĩa là bạn có thể không gọi chúng là "bài kiểm tra đơn vị" mà là "bài kiểm tra riêng" hoặc bất cứ điều gì bạn muốn gọi chúng.
Ngôn ngữ Swift giải quyết vấn đề mà bạn không muốn đưa A, B, C thành các phương thức công khai chỉ vì bạn muốn kiểm tra nó bằng cách cung cấp cho các hàm một thuộc tính "có thể kiểm tra". Trình biên dịch cho phép các phương thức kiểm tra riêng được gọi từ các bài kiểm tra đơn vị, nhưng không phải từ mã không kiểm tra.