Swift:在ViewController中为私有功能创建单元测试

问题描述 投票:0回答:1

我正在尝试测试我的viewcontroller,但不确定如何在其中测试私有函数。它说是私人的。显然,我可以将其公开,但这似乎无法达到目的。

   import Quick
    import Nimble
    @testable import Recur

class ProfileDetailVCSpec: QuickSpec {
    class TestProfileDetailVC: ProfileDetailVC {
        var isProfileUpdated = false

        override func updateProfile() {
            isProfileUpdated = true
        }
        func pressDone() {
            doneButtonPressed() //COMPILER WON'T ALLOW, BECAUSE IT'S PRIVATE
        }
    }
    override func spec() {
        var testProfileDetailVC: TestProfileDetailVC!
        beforeEach {
            testProfileDetailVC = TestProfileDetailVC()
        }
        describe("edit profile") {
            context("user makes changes to name") {
                it("should call updateProfile") {
                    testProfileDetailVC.nameTextFieldValidInputEntered(ProfileEditNameView(), "TestFirst", "TestLast")
                    testProfileDetailVC.pressDone()
                    expect(testProfileDetailVC?.isProfileUpdated).to(equal(true))
                }
            }
            context("user makes changes to photo") {
                it("should call updateProfile") {
                    testProfileDetailVC.nameTextFieldValidInputEntered(ProfileEditNameView(), "TestFirst", "TestLast")
                    testProfileDetailVC.pressDone() 
                    expect(testProfileDetailVC?.isProfileUpdated).to(equal(true))
                }
            }
            context("user doesn't make any changes") {
                it("should not call updateProfile") {
                    testProfileDetailVC.pressDone()
                    expect(testProfileDetailVC?.isProfileUpdated).to(equal(false))
                }
            }
        }
    }
}

这里是视图控制器。我的同事仍在研究某些逻辑,但大部分都在那儿。我只是似乎无法迅速调用私有函数,所以我无法运行这些测试

class ProfileDetailVC: UIViewController {
    private let doneButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Done", for: .normal)
        button.titleLabel?.font =  UIFont(name: "SFCompactRounded-Semibold", size: 16)
        button.tintColor = .recurBlue
        button.addTarget(self, action: #selector(doneButtonPressed), for: .touchUpInside)
        return button
    }()

    let profileNameEditView = ProfileEditNameView()
    let errorLabel: UILabel = {
        let label = UILabel()
        label.textColor = .red
        label.font = .regularSubtitle
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        loadProfileImage()
        setupUI()
        profileNameEditView.delegate = self
    }

    func updateProfile() {

    }

    private func loadProfileImage() {
        if let profile = Profile.currentProfile {
            profileImage.configure(with: profile, imageSize: CGSize(width: 120, height: 120))
        }
    }

    @objc private func doneButtonPressed() {
        updateProfile()
    }

extension ProfileDetailVC: ProfileEditNameViewDelegate {
    func nameTextFieldNonValidInputEntered(_: ProfileEditNameView) {
        errorLabel.text = "First and last name required"
    }

    func nameTextFieldValidInputEntered(_: ProfileEditNameView, _ firstNameText: String, _ lastNameText: String) {
        errorLabel.text = ""
    }
}
swift unit-testing testing viewcontroller
1个回答
0
投票

无法访问私有功能进行测试。但是,您正在使用的@ testable属性将允许您在测试中使用内部功能。因此,您可以删除private关键字,并且该类默认为internal,因为该类为internal

© www.soinside.com 2019 - 2024. All rights reserved.