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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?