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.
- Undefined symbol: nominal type descriptor for Eureka.BaseRow
- 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
}
}
The solution was to load the VC in a UIWindow