Swift: создание модульного теста для приватных функций в ViewController - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь протестировать свой 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))
                }
            }
        }
    }
}

Вот контроллер вида. Часть логики, над которой мой коллега все еще работает, но в основном она есть. Я просто не могу вызвать частные функции в swift, поэтому не могу запустить эти тесты

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 = ""
    }
}

1 Ответ

1 голос
/ 25 октября 2019

Нет способа получить доступ к частному функционалу для тестирования. Используемый вами атрибут @ testable позволит вам использовать в тесте внутреннюю функцию . Таким образом, вы можете отбросить приватное ключевое слово, и по умолчанию функция будет иметь значение внутренний , поскольку класс внутренний .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...