Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unit Testing UIViewController
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Parveen Kaler
September 14, 2018
Programming
0
370
Unit Testing UIViewController
Lightning talk from NSSpain 2018.
5 tips in 5 minutes.
Parveen Kaler
September 14, 2018
Tweet
Share
More Decks by Parveen Kaler
See All by Parveen Kaler
Millions of Customers. Billions of Dollars: iOS Architecture at Scale
kaler
0
2.5k
What's New in Swift 2.0
kaler
0
780
Opinionated Core Data: Hold On To Your Butts
kaler
0
1.7k
Other Decks in Programming
See All in Programming
Patterns of Patterns
denyspoltorak
0
1.4k
AI & Enginnering
codelynx
0
110
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
130
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
220
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
940
AI時代の認知負荷との向き合い方
optfit
0
150
ぼくの開発環境2026
yuzneri
0
170
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.5k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
700
組織で育むオブザーバビリティ
ryota_hnk
0
170
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
730
What's in a price? How to price your products and services
michaelherold
247
13k
Amusing Abliteration
ianozsvald
0
97
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.1k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
120
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
200
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
57
50k
A better future with KSS
kneath
240
18k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
200
Testing 201, or: Great Expectations
jmmastey
46
8k
Transcript
UNIT TESTING UIVIEWCONTROLLERS 5 TIPS IN 5 MINUTES !!!!! 1
— Parveen Kaler • @kaler • https://parveenkaler.com
! TIP #1 2 — Parveen Kaler • @kaler •
https://parveenkaler.com
class FirstTests: XCTestCase { var sut: ViewController! override func setUp()
{ super.setUp() let sut = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController } } 3 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: ViewController! override func setUp() { super.setUp() let sut
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController } func testViewNotNil() { XCTAssertNotNil(sut.view) // ❎ FAIL } 4 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: ViewController! override func setUp() { super.setUp() let sut
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController sut.loadView() // ! DON'T!!! } func testViewNotNil() { XCTAssertNotNil(sut.view) // ❎ FAIL } 5 — Parveen Kaler • @kaler • https://parveenkaler.com
6 — Parveen Kaler • @kaler • https://parveenkaler.com
7 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: ViewController! override func setUp() { super.setUp() let sut
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController UIApplication.shared.keyWindow?.rootViewController = sut // Run View Lifecycle } func testViewNotNil() { XCTAssertNotNil(sut.view) // ✅ SUCCESS } 8 — Parveen Kaler • @kaler • https://parveenkaler.com
TIP #2 9 — Parveen Kaler • @kaler • https://parveenkaler.com
10 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: ViewController! override func setUp() { super.setUp() let tab
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = tab // Run View Lifecycle let nav = tab.selectedViewController as! UINavigationController sut = nav.topViewController as! ViewController UIApplication.shared.keyWindow?.rootViewController = sut // Run View Lifecycle } 11 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: ViewController! override func setUp() { super.setUp() let tab
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = tab // Run View Lifecycle let nav = tab.selectedViewController as! UINavigationController sut = nav.topViewController as! ViewController UIApplication.shared.keyWindow?.rootViewController = sut // Run View Lifecycle } func testViewNotNil() { XCTAssertNotNil(sut.view) // ✅ SUCCESS } 12 — Parveen Kaler • @kaler • https://parveenkaler.com
TIP #3 13 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: SecondViewController! override func setUp() { super.setUp() let tab
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = tab // Run View Lifecycle tab.selectedIndex = 1 // ! Switch tabs let nav = tab.selectedViewController as! UINavigationController sut = nav.topViewController as! SecondViewController UIApplication.shared.keyWindow?.rootViewController = sut // Run View Lifecycle } 14 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: SecondViewController! override func setUp() { super.setUp() let tab
= UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = tab // Run View Lifecycle tab.selectedIndex = 1 // ! Switch tabs let nav = tab.selectedViewController as! UINavigationController sut = nav.topViewController as! SecondViewController UIApplication.shared.keyWindow?.rootViewController = sut // Run View Lifecycle } func testViewNotNil() { XCTAssertNotNil(sut.view) // ✅ SUCCESS } 15 — Parveen Kaler • @kaler • https://parveenkaler.com
TIP #4 16 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: SecondViewController! override func setUp() { super.setUp() sut =
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController UIApplication.shared.keyWindow?.rootViewController = sut // ! Run View Lifecycle } 17 — Parveen Kaler • @kaler • https://parveenkaler.com
TIP #5 18 — Parveen Kaler • @kaler • https://parveenkaler.com
19 — Parveen Kaler • @kaler • https://parveenkaler.com
class ViewController: UIViewController { var topViewController: TopViewController! var bottomViewController: BottomViewController!
// ! prepare() passes VCs in segue override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? TopViewController { topViewController = vc } else if let vc = segue.destination as? BottomViewController { bottomViewController = vc } } } 20 — Parveen Kaler • @kaler • https://parveenkaler.com
// ! prepare() passes VCs in segue override func prepare(for
segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? TopViewController { topViewController = vc } else if let vc = segue.destination as? BottomViewController { bottomViewController = vc } } // ! prepare() is called before viewDidLoad() override func viewDidLoad() { super.viewDidLoad() } 21 — Parveen Kaler • @kaler • https://parveenkaler.com
var sut: ViewController! func testViewContainment() { XCTAssertNotNil(sut.topViewController) // SUCCESS XCTAssertNotNil(sut.bottomViewController)
// SUCCESS } 22 — Parveen Kaler • @kaler • https://parveenkaler.com
UNIT TESTING UIVIEWCONTROLLERS ! 5 TIPS IN 5 MINUTES 23
— Parveen Kaler • @kaler • https://parveenkaler.com