Slide 1

Slide 1 text

Կނςετ͕ॻ͚ͳ͍ͷ͔ iOS Test Night #6 1

Slide 2

Slide 2 text

Profile Kazuya Ueoka Timers inc.ͷiOSΤϯδχΞ Twitter: @fromkk Github: fromkk Qiita: fromkk Sarahah: fromkk 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

ʊਓਓਓਓਓʊ ʼɹςετ0ɹʻ ʉY^Y^Y^Yʉ 5

Slide 6

Slide 6 text

ςετΛͪΌΜͱ ॻ͔ͳ͍ͱͳʔͱ͸ࢥͬͯ͸͍·ͨ͠ 6

Slide 7

Slide 7 text

͊͞ɺطଘίʔυʹ ςετΛॻ͜͏ 7

Slide 8

Slide 8 text

ͱࢥͬͯ طଘίʔυΛோΊ·͢ 8

Slide 9

Slide 9 text

! 9

Slide 10

Slide 10 text

μϝͩɺςετॻ͚ͳ͍ 10

Slide 11

Slide 11 text

Կނͳͷ͔ 11

Slide 12

Slide 12 text

ςετ͕ॻ͚ͳ͍งғؾ • ViewControllerͰ࣮σʔλʹ௚઀ΞΫηε • ຊ൪αʔόʔ/ϩʔΧϧDB/UserDefaults౳ • ίʔυ಺Ͱγϯάϧτϯݺͼग़͠ • ҰͭͷΫϥε͕੹຿Λ͍࣋ͪ͗ͯ͢Δ(અࢠ) • ΠϕϯτϋϯυϦϯά/delegate/Notification/Observation ౳ͷॲཧΛશͯ੥͚ෛ͍ͬͯΔ 12

Slide 13

Slide 13 text

ςετ 0ݸ ͳϓϩδΣΫτʹ ϢχοτςετΛ௥Ճͯ͠Έͨ 13

Slide 14

Slide 14 text

ର৅ͷը໘ 14

Slide 15

Slide 15 text

ࠓճͷςετͷ؍఺ • ը໘ىಈ࣌ʹMarkdownϑΝΠϧΛಡΈࠐΜͰtextViewͷॳ ظ஋ʹઃఆ͞Ε͍ͯΔࣄ • อଘ͍ͨ͠λΠϛϯάͰอଘ͞ΕΔࣄ 15

Slide 16

Slide 16 text

΍ͬͨࣄ ͦͷ1 16

Slide 17

Slide 17 text

ςετத͸RealmΛInMemoryػೳΛ༗ޮʹ class DB { static var isTesting: Bool = false private static var userConfiguration: Realm.Configuration { return Realm.Configuration() } private static var inMemoryConfiguration: Realm.Configuration { return Realm.Configuration(inMemoryIdentifier: "InMemory") } static var realm: Realm { let configuration: Realm.Configuration if isTesting { configuration = inMemoryConfiguration } else { configuration = userConfiguration } return try! Realm(configuration: configuration) } } 17

Slide 18

Slide 18 text

΍ͬͨࣄ ͦͷ2 18

Slide 19

Slide 19 text

ʊਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹઃܭͷݟ௚͠ʂʂʂɹʻ ʉY^Y^Y^Y^Y^Y^Y^Y^Y^Yʉ 19

Slide 20

Slide 20 text

͜Ε·Ͱ 20

Slide 21

Slide 21 text

ݟ௚͠ޙ 21

Slide 22

Slide 22 text

ςετ @testable import Type class RegisterViewControllerTests: XCTestCase { class MockRegistrable: MarkdownRegistrable { let defaultValue = "Hello world" func open(_ completed: @escaping (String) -> ()) { completed(defaultValue) } var isSaved: Bool = false func save(with markdown: String) { isSaved = true } } private func makeViewController() -> RegisterViewController { let registrable = MockRegistrable() let viewController = RegisterViewController() viewController.registrable = registrable return viewController } func testOpen() { let viewController = makeViewController() viewController.open() XCTAssetEqual(registrable.textView.text, "Hello world") } func testSave() { let viewController = makeViewController() viewController.save(with: "hoge huga") XCTAssetTrue(registrable.isSaved) } } 22

Slide 23

Slide 23 text

ςετ͕ॻ͚ͨ 23

Slide 24

Slide 24 text

ςετΛॻ͍ͯݟͯ • ςετ͕ॻ͚Δ͔Ͳ͏͔͸ઃܭ࣍ୈͱ͍͏ࣄ͕਎ʹ͠Έͯ෼ ͔ͬͨ • ϓϩύςΟ͕ࠩ͠ସ͕͑Մೳɾ֎͔Β஋͕౉ͤΔ༷ʹͳͬ ͍ͯΔࣄ͕ॏཁ • (࣮ίʔυͰ͸΋͏গ͠ςετΛॻ͍͕ͨ)؍఺ͷ࿙Εʹؾ෇ ͘ࣄ͕ग़དྷͨ 24

Slide 25

Slide 25 text

·ͱΊ • ςετෆՄೳΛςετՄೳʹม͑Δࣄ͕ग़དྷ·ͨ͠ • ςετ͕ग़དྷͳ͍࣌͸ઃܭΛݟ௚͢ • ઃܭΛݟ௚ͤ͹ςετ͕ग़དྷΔ • େ෯ʹઃܭΛม͑ͯ΋ςετ͕͋ΔͷͰ҆৺ 25

Slide 26

Slide 26 text

PR 26

Slide 27

Slide 27 text

27

Slide 28

Slide 28 text

28

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

ΤϯδχΞืूத 30

Slide 31

Slide 31 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 31