如何使用 XCTest 在以编程方式添加的 UIView 上测试 UILabel

Posted

技术标签:

【中文标题】如何使用 XCTest 在以编程方式添加的 UIView 上测试 UILabel【英文标题】:How to test a UILabel on a programatically added UIView with XCTest 【发布时间】:2018-05-11 08:56:51 【问题描述】:

我想测试我的dashboardLabel.text,但我不知道如何通过 XCTest 访问它。

DashboardView.swift 看起来像这样:

import UIKit

class DashBoardView: UIView 

override init(frame: CGRect) 
    super.init(frame: frame)

    createSubviews()


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    fatalError("init(coder:) has not been implemented")


// MARK: - Create Subviews

func createSubviews() 
    backgroundColor = .white

    var dashboardLabel : UILabel

    dashboardLabel = 
        let label = UILabel()
        label.text = "Dashboard Label"
        label.textColor = .black
        label.frame = CGRect(x:60, y:80, width: 200, height: 30)
        label.backgroundColor = .green
        label.backgroundColor = .lightGray
        label.font = UIFont(name: "Avenir-Oblique", size: 13)
        label.textAlignment = .center
        return label
    ()


DashboardViewController.swift 看起来像这样:

import UIKit

class DashBoardViewController: UIViewController 

    var dashboardview = DashBoardView()

    //MARK: View Cycle
    override func loadView() 
         view = dashboardview
    

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
    

    override func viewDidLoad() 
        super.viewDidLoad()

        title = "DashBoard"
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    


我知道如何测试DashboardViewController.swift的标题

import XCTest
@testable import DashBoard

class DashBoardTests: XCTestCase 
    func test_if_title_is_DashBoard() 

    let vc = DashBoardViewController()
    let _ = vc.view
    XCTAssertEqual(vc.navigationItem.title, "Dashboard")

但我完全不知道如何访问DashBoardView.swift 上的dashboardLabel

我希望这可以解释我的问题,并且你们中的任何人都可以帮助我,或者为我指明正确的方向!

谢谢✌️

【问题讨论】:

【参考方案1】:

你可以使用accessibilityIdentifier来做到这一点

参考:ios XCUITests access element by accesibility

【讨论】:

我决定采取不同的方法,但感谢您的回答!【参考方案2】:

一位软件开发人员告诉我一个非常酷的解决方案!您需要将 Label 声明为属性,如下所示

private(set) var dashboardLabel = UILabel()

现在您可以访问 XCTest 中的属性。这是有道理的,因为您只能测试可以从外部访问的东西

import UIKit

class DashBoardView : UIView 

    private(set) var dashboardLabel = UILabel()


XCTest文件

import XCTest
@testable import DashBoard

class DashBoardTests: XCTestCase 
    func test_if_dashboard_label_has_title_DashBoard() 

        let vc = DashBoardView()
        XCTAssertEqual(vc.dashboardLabel.text, "DashBoard")
    

希望有帮助!

【讨论】:

以上是关于如何使用 XCTest 在以编程方式添加的 UIView 上测试 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

如何在以编程方式创建的 UIButton 上添加 padding-left?

在以编程方式创建的 UIView 层次结构之上添加子视图

ObjC,在以编程方式添加/删除后恢复为界面构建器自动布局约束?

xctest - 如何测试是不是在按下按钮时加载新视图

如何在以编程方式创建实体时设置 NSManagedObjectModel 的配置。

IOS5 - 如何在以编程方式创建的视图中播放视频?