Reputation: 9494
I am creating an unit-test to test value which is back from second ViewController.
Program flow :
1. FirstVC got clicked and then pass number 200 to SecondVC.
2. SecondVC received number and increment it by 1.
3. SecondVC got clicked on "Back" button. It sends back 201 to FirstVC.
FirstVC :
import UIKit
class FirstVC: UIViewController {
var number : Int?;
var destVC : SecondVC?;
override func viewDidLoad() {
super.viewDidLoad()
number = 200;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func hitButton(sender: AnyObject) {
performSegueWithIdentifier("goNext", sender: self);
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let svc = segue.destinationViewController as! SecondVC;
svc.receivedNumber = self.number;
self.destVC = svc
}
@IBAction func backToFirstVC(segue: UIStoryboardSegue){
if(segue.identifier == "backSegue"){
let srcVC = segue.sourceViewController as! SecondVC;
self.number = srcVC.receivedNumber;
print(self.number);
}
}
}
SecondVC.swift :
import UIKit
class SecondVC: UIViewController {
var receivedNumber : Int?;
@IBOutlet weak var numberLbl: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.receivedNumber = self.receivedNumber! + 1;
self.numberLbl.text = String(self.receivedNumber!);
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func hitBackBtn(sender: AnyObject) {
performSegueWithIdentifier("backSegue", sender: self);
}
}
FirstVCTests.swift :
import XCTest
@testable import practiceTesting
class practiceTestingTests: XCTestCase {
var firstVC :practiceTesting.FirstVC!
var storyboard : UIStoryboard!;
var storyboardsegue : UIStoryboardSegue!;
override func setUp() {
super.setUp()
storyboard = UIStoryboard(name: "Main", bundle: nil)
firstVC = storyboard.instantiateViewControllerWithIdentifier("FirstVC") as! practiceTesting.FirstVC;
_ = firstVC.view;
}
func testExample() {
firstVC.hitButton(self);
firstVC.destVC!.hitBackBtn(self);
XCTAssertEqual(firstVC.number, 201)
}
}
Error Message :
XCTAssertEqual failed: ("Optional(200)") is not equal to ("Optional(201)")
It seems like .hitButton()
does not finish the job yet, but XCTAssertEqual()
simultaneoulsy do the assert task.
How can I let .hitButton()
wait the calculation from secondVC
and then assert the returned value?
Update : I will be back for my topic again, for now. I will test just a function.
import XCTest
@testable import practiceTesting
class FirstVCTests: XCTestCase {
var firstVC :practiceTesting.FirstVC!
var secondVC:practiceTesting.SecondVC!
var storyboard : UIStoryboard!;
var segue1 : UIStoryboardSegue!;
var segue2 : UIStoryboardSegue!;
override func setUp() {
super.setUp()
storyboard = UIStoryboard(name: "Main", bundle: nil);
firstVC = storyboard.instantiateViewControllerWithIdentifier("FirstVC") as! practiceTesting.FirstVC;
secondVC = storyboard.instantiateViewControllerWithIdentifier("SecondVC") as! practiceTesting.SecondVC;
segue1 = UIStoryboardSegue.init(identifier: "goNext", source: firstVC, destination: secondVC)
segue2 = UIStoryboardSegue.init(identifier: "backSegue", source: secondVC, destination: firstVC);
_ = firstVC.view;
}
func testB(){
secondVC.receivedNumber = 300;
firstVC.backToFirstVC(segue2);
XCTAssertEqual(firstVC.number, 300);
}
}
Upvotes: 1
Views: 238
Reputation: 25486
Unwind segue will create a new firstVC
after performed. You should get the real firstVC
in SecondVC
's prepareForSegue
Upvotes: 1