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
Parveen Kaler
September 14, 2018
Programming
0
350
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.4k
What's New in Swift 2.0
kaler
0
730
Opinionated Core Data: Hold On To Your Butts
kaler
0
1.5k
Other Decks in Programming
See All in Programming
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
670
『GO』アプリ バックエンドサーバのコスト削減
mot_techtalk
0
130
Ruby on cygwin 2025-02
fd0
0
140
Java Webフレームワークの現状 / java web framework at burikaigi
kishida
9
2.2k
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
260
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
270
WebDriver BiDiとは何なのか
yotahada3
1
140
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
3
4.1k
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
10
1.8k
Amazon Bedrock Multi Agentsを試してきた
tm2
1
280
さいきょうのレイヤードアーキテクチャについて考えてみた
yahiru
3
730
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
220
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Rails Girls Zürich Keynote
gr2m
94
13k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
8
270
GitHub's CSS Performance
jonrohan
1030
460k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Producing Creativity
orderedlist
PRO
343
39k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Building Applications with DynamoDB
mza
93
6.2k
Thoughts on Productivity
jonyablonski
69
4.5k
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