UnitTesting ViewController that contains Eureka form

314 Views Asked by At

I'm trying to implement unit testing for one of my ViewControllers that contains a massive form generated by Eureka forms for Swift.

The code compiled well, but received two errors when test was executed.

  1. Undefined symbol: nominal type descriptor for Eureka.BaseRow
  2. Undefined symbol: Eureka.Form.allRows.getter : [Eureka.BaseRow]

The code in my test file

import XCTest
@testable import MyProject

class DataEntryViewControllerTest: XCTestCase {

    var mainvc: MyProject.DataEntryViewController!

    private func setupViewControllers() {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

        let newObject = ModelManager.createObject()
        self.mainvc = storyboard.instantiateViewController(withIdentifier: "dataEntryView") as? DataEntryViewController

        // this .dataEdit is required
        self.mainvc.dataEdit = newObject
        self.mainvc.loadView()
        self.mainvc.viewDidLoad()
    }

    override func setUp() {
        super.setUp()
        self.setupViewControllers()
    }

    override func tearDown() {
        mainvc = nil
        super.tearDown()
    }

    func testViewDidLoad() throws {
        XCTAssertNotNil(self.mainvc, "Main VC is nil")
        let form = mainvc.form

        // If i comment away both of these lines, the test would pass. 
        // having Either one of them kills the process
        XCTAssertEqual(form.allRows.first?.tag, "")
        XCTAssertEqual(mainvc.form.rowBy(tag: "date")?.baseValue as Date!, Date())
    }

    func testPerformanceExample() throws {
        // This is an example of a performance test case.
        self.measure {
            // Put the code you want to measure the time of here.
        }
    }

}

Relavent code from the view controller

import UIKit
import Eureka
import CoreData

class DataEntryViewController: FormViewController, UITextFieldDelegate {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    // compulsory 
    var dataEdit: object!

    @IBOutlet weak var addOrEditButton: UIBarButtonItem!

    override func viewDidLoad() {

        super.viewDidLoad()

        let form = formPrinter()
        form.delegate = self

        // Triggers hide or show form, incase the object is coming in already locked.
        hideOrShowAllForms()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }

    //MARK: - Form printer
    func formPrinter() -> Form {
        form +++ Section("Date (UTC)")
            <<< DateRow("date"){ row in
                row.disabled = Condition(booleanLiteral: self.dataEdit?.isLocked ?? false)
                } .cellSetup { cell, row in
                row.title = "Date"
                row.value = self.dataEdit == nil ? Date() : self.dataEdit?.date
                row.dateFormatter?.timeZone = TimeZone(secondsFromGMT: 0)
                cell.datePicker.timeZone = TimeZone(secondsFromGMT: 0)
            }
        return form
    }  
 }

1

There are 1 best solutions below

0
Ong Pe Hon On

The solution was to load the VC in a UIWindow

var vc: Simply_Log_Beta.DataEntryViewController!
    let window = UIWindow(frame: UIScreen.main.bounds)
    
    private func setupViewControllers(isFlight: Bool = true) {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        self.vc = storyboard.instantiateViewController(withIdentifier: "dataEntryView") as? DataEntryViewController
        window.rootViewController = vc
        window.makeKeyAndVisible()
    }