Như Leif đề cập, RackUnit của require/expose
sẽ cho phép sử dụng định danh không được cung cấp trong các module khác, nhưng its own documentation không hứa hẹn một đảm bảo rất mạnh:
Lưu ý rằng require/expose
có thể là một chút mong manh, đặc biệt là khi trộn với mã biên dịch. Sử dụng có nguy cơ của riêng bạn!
Một cách tiếp cận khác sẽ là sử dụng submodules, có hiệu quả có thể cung cấp cách xử phạt để xuất API riêng tư để sử dụng trong kiểm tra hoặc các phương tiện khác.
Ví dụ, hãy xem xét một module mà thực hiện một chức năng để kiểm tra xem một chuỗi có chứa một từ duy nhất: (. Đây là, có lẽ, không phải là ví dụ thực tế nhất, nhưng chịu với tôi)
#lang racket
(provide word?)
(define (word? str)
(not (ormap space? (string->list str))))
(define (space? c)
(eq? C#\space))
Có thể hữu ích khi kiểm tra chức năng space?
để đảm bảo chức năng hoạt động, nhưng có thể không phải là một phần của API công khai. Để tạo một "lối thoát", nó có thể để xác định một submodule rằng xuất khẩu này ràng buộc:
(module+ for-testing
(provide space?))
Tên for-testing
là tùy ý-nó có thể là bất cứ điều gì. Dù bằng cách nào, nó bây giờ có thể yêu cầu submodule trong mô-đun khác để có được quyền truy cập vào các ràng buộc tin:
#lang racket
(require rackunit
(submod "a.rkt" for-testing))
(check-true (space? #\space))
(check-false (space? #\a))
Đây là một cái gì đó một cách an toàn hơn để lộ định danh từ module mà không lộ chúng cho tất cả người tiêu dùng.
Nguồn
2015-12-06 21:27:37
Ý tưởng gọn gàng cho câu hỏi tự trả lời, nhưng bạn có thể muốn thêm động lực hơn trong câu hỏi. Tức là, làm rõ rằng đây là để thử nghiệm, không phải cái gì bạn muốn làm nói chung. –
Đó là một ý tưởng hay, tôi sẽ thay đổi điều đó. –