如何测试在视图控制器单元测试中设置私有变量的方法?

Posted

技术标签:

【中文标题】如何测试在视图控制器单元测试中设置私有变量的方法?【英文标题】:how to test methods which set private variables in viewcontroller unit testing? 【发布时间】:2019-12-12 18:16:46 【问题描述】:

我有一个符合协议的 ViewController。 ViewController 具有以下私有 UI 组件: backgroundImage、logoimage、loginButton、signupButton - 所有这些都是私有的。 (因此单元测试无法访问)

如何在单元测试中测试以下协议方法的实现?我正在使用XCTestFramework 进行单元测试。

extension ViewController : ViewControllerProtocol
    func setbackgroundImage(_ image: UIImage) 
        backgroundImage.image = image
    

    func setLogoImage(_ image: UIImage) 
        logoImage.image = image
    

    func setLoginButtontitle(_ title: String) 
        loginButton.setTitle(title, for: .normal)
    

    func setSignupButtonTitle(_ title: String) 
        signupButton.setTitle(title, for: .normal)
    


protocol ViewControllerProtocol 
    func setbackgroundImage(_ image : UIImage)
    func setLogoImage(_ image : UIImage)
    func setLoginButtontitle(_ title: String)
    func setSignupButtonTitle(_ title: String)
    func setTitleLabel(_ title: String)
    func setContinuewithoutsignupTitle(_ title: String)


【问题讨论】:

你用过XCTest Framework吗? 是的,我正在使用 xctest 框架 您的ViewControllerProtocol 是在哪里定义的?你能分享那个代码吗? 我已经更新了问题。 您要求的只是一个示例单元测试吗? 【参考方案1】:

您仍然可以通过添加公共 getter 来对下面的这些值进行单元测试


protocol ViewControllerProtocol 
    func setbackgroundImage(_ image : UIImage)
    func setLogoImage(_ image : UIImage)
    func setLoginButtontitle(_ title: String)
    func setSignupButtonTitle(_ title: String)
    func setTitleLabel(_ title: String)
    func setContinuewithoutsignupTitle(_ title: String)
    func getbackgroundImage() -> UIImage?
    func getlogoImage() -> UIImage?
    func getloginButtonTitle() -> String?
    func getsignupButtonTitle() -> String?


class MainTest: XCTestCase 

    let viewController = ViewController()

    override func setUp() 
        super.setUp()
    

    func testExample() 
        guard let testImage1 = UIImage(named: "testImage1") else 
            XCTFail("Could not load test image 1")
            return
        
        viewController.setbackgroundImage(testImage1)
        XCTAssert(viewController.getbackgroundImage() == testImage1)
        guard let testImage2 = UIImage(named: "testImage2") else 
            XCTFail("Could not load test image 2")
            return
        
        viewController.setLogoImage(testImage2)
        XCTAssert(viewController.getlogoImage() == testImage2)
        viewController.setLoginButtontitle("test")
        XCTAssert(viewController.getloginButtonTitle() == "test")
        viewController.setSignupButtonTitle("test")
        XCTAssert(viewController.getsignupButtonTitle() == "test")
    


【讨论】:

是的,公共吸气剂应该可以正常工作。非常感谢。

以上是关于如何测试在视图控制器单元测试中设置私有变量的方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 8 中设置单元测试环境

如何在 Swift 中设置单元测试?

如何使用 XCTest 测试一个 navigationBar 是不是未在 Objective-C 中设置为特定颜色?

如何在Vuejs单元测试中设置或测试。$ parent?

在Laravel 4单元测试中,如何在请求中设置cookie?

如何在 Xcode 4.5“命令行工具”项目中设置工作逻辑单元测试目标?