问题描述
public class ReviewManager {
public static let shared = ReviewManager()
private static let startDateKey = "StartDate"
private static let popupLastSeenKey = "LastSeen"
private static let lastVersionPromptedForReview = "lastVersionPromptedForReview"
private(set) var startDate: Date {
get {
Date()
}
set { }
}
private(set) var lastPopupDate: Date? {
get {
}
set {
}
}
private(set) var lastVersionPromptedForReview: String {
get {
}
set {
}
}
private(set) var appCurrentVersion: String {
get {
// Get the current bundle version for the app
guard let currentVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
else {
logError("Expected to find a bundle version in the info dictionary")
return ""
}
return currentVersion
}
set { }
}
private func requestReview() {
SKStoreReviewController.requestReview()
lastPopupDate = Date()
lastVersionPromptedForReview = appCurrentVersion
}
public func requestReviewIfPossible() {
let today = Date()
if lastPopupDate == nil {
if allowedToPresentToday() && allowedToPresentForThisversion() {
requestReview()
}
} else {
if let lastPopupDate = lastPopupDate {
if allowedToPresentToday() && allowedToPresentForThisversion() {
requestReview()
}
}
}
}
private func allowedToPresentToday() -> Bool {
let calendar = Calendar(identifier: .gregorian)
let today = Date()
let components = calendar.dateComponents([.weekday],from: today!)
return components.weekday == 5 || components.weekday == 6
}
private func allowedToPresentForThisversion() -> Bool {
let allowedToShowForThisversion = (appCurrentVersion != lastVersionPromptedForReview) ? true : false
return allowedToShowForThisversion
}
}
现在我想为这个类中的所有私有函数编写单元测试。我可以通过将访问修饰符设为
来访问此类中的私有属性私人(套装)
但是不能在类外访问私有函数。
有没有办法在 Swift 中对私有函数进行单元测试?
解决方法
完全回应@luk2302,因为您应该测试公共接口。但是如果你觉得你真的必须,也许可以考虑在私有函数周围创建一个包装函数来公开它。您可以有条件地进行编译,在本示例中仅在调试模式下进行,因此它不会污染您的生产代码:
class MyClass {
private func myPrivateFunc() -> Void {
print("Hello")
}
}
#if DEBUG
extension MyClass {
func myPublicFunc() -> Void {
myPrivateFunc()
}
}
#endif
let myClass = MyClass()
myClass.myPublicFunc()