如何快速对类的私有成员进行单元测试?

问题描述

我有一个类,其中的公共和私有成员很少,如下所示:

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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...