Slide 1

Slide 1 text

ViewControllerͷ୯ମςετ Swift 3ରԠ

Slide 2

Slide 2 text

ࣗݾ঺հ • ໊લɿίʔυώʔϤΞϯ • ग़਎ɿGrenoble • ৬ۀɿιϑτΤΞʔΤϯδχΞʔ • ։ൃܦݧɿDelphiʢ7೥ʣɺSwiftʢ̍೥ʣ • Facebookɿhttps://www.facebook.com/yoann.coldefy • Twitterɿ@luinily

Slide 3

Slide 3 text

גࣜձࣾΨϥύΰε • εϚϗΞϓϦͷ։ൃɺӡӦ • σΟϨΫλʔɺΤϯδχΞʔɺ σβΠφʔɺςελʔ • 35ਓ • web: https://www.glpgs.com/

Slide 4

Slide 4 text

ΤϯδχΞʔืूதʂ

Slide 5

Slide 5 text

• લճ͸CleanSwiftͷ঺հ • CleanSwift͸ςετۦಈ։ൃ͕جຊ • ViewControllerͷςετ͸Ͳ͏ͳͬͯΔʁ

Slide 6

Slide 6 text

ViewControllerͱ͸Կʁ • ΞϓϦͷҰͭͷը໘Λίϯτϩʔϧ͢ΔΫϥε • Ͳ͜ʹԿΛදࣔ͢Δ • Ϣʔβ͕ૢ࡞ͨ࣌͠ʹΞϓϦ͸Ͳ͏൓Ԡ͢Δ

Slide 7

Slide 7 text

୯ମςετ͸ʁ • ϓϩάϥϜͷҰ෦Λࣗಈతʹςετ͢Δ • ૝ఆ͞ΕͯΔ݁Ռͱ࣮ࡍͷ݁Ռ͕ಉ͔͡Λ֬ೝ͢Δ
 
 ྫɿը໘͕දࣔ͞Εͨ࣌ʹϥϕϧͷςΩετ͕ ʮTestʯʹͳ͍ͬͯΔ͔Ͳ͏͔ɻ

Slide 8

Slide 8 text

ͳͥ୯ମςετΛॻ͘ʁ • ग़དྷ্͕ͬͨϓϩάϥϜ͕࢖༻௨Γʹಈ࡞Λ͍ͯ͠Δ ͷΛࣗಈతʹςετͰ͖Δɻ • ϓϩάϥϜͷमਖ਼΍มߋͰಈ͔ͳ͘ͳͬͨͱ͜ΖΛൃ ݟ͠΍͘͢͢Δ • ࣮૷ͷπʔϧͷҰͭ

Slide 9

Slide 9 text

λΠτϧ ը૾ ςΩετ Ϙλϯ ViewController title: Label
 picture: ImageView text: TextView button: Button

Slide 10

Slide 10 text

ViewControllerͷ࣮ମԽͷ໰୊ • ViewController͸͍͔ͭ͘ͷViewΛ͍࣋ͬͯΔ͕ • ViewController͕ͦͷViewΛ࣮ମԽͤͯ͞Δ༁Ͱ͸ͳ͍ • ୯ମςετ༻ViewControllerͷΠϯελϯεΛ࡞ͬͨͩ ͚ͰɺϏϡʔ͸nilͷ··

Slide 11

Slide 11 text

ςετͰViewController
 ͷ࣮ମԽ͸Ͳ͏͢Δʁ

Slide 12

Slide 12 text

func setupViewController() { let storyboard = UIStoryboard(name: "MyStoryboard", bundle: Bundle.main) if let viewController = storyboard.instantiateInitialViewController() as? MyViewController { target = viewController } } ී௨ʹStoryboardͳͲ͔ΒͰ͖·͢ɻ class RegisterAccountViewControllerTests: XCTestCase { // MARK: Subject under test var target: MyViewController!

Slide 13

Slide 13 text

͜Ε͚ͩͩͱϏϡʔ͕
 ϩʔυ͞Εͳ͍ɻ

Slide 14

Slide 14 text

WindowΛ௥Ճͯ͠ɺϏϡʔΛϩʔυ͠·͢ɻ class RegisterAccountViewControllerTests: XCTestCase { // MARK: Subject under test var target: MyViewController! var window: UIWindow! ← New! func loadView() { window.addSubview(target.view) RunLoop.current.run(until: Date()) } ඞཁ͚ͩͲཧ༝͕Θ͔Βͳ͍

Slide 15

Slide 15 text

loadViewΛݺΜͩΒɺϏϡʔ͕ϩʔυ͞Εͯɺ viewDidLoad͕ݺ͹Ε·͢ɻ
 ςετͰ͖·͢ʂ

Slide 16

Slide 16 text

ͲΜͳ͜ͱΛςετ͢Δʁ

Slide 17

Slide 17 text

ViewDidLoadͰઃఆ͞ΕΔ΋ͷ override func setUp() { dataSource = MockDataSource() target.dataSource = dataSource } func test_viewDidLoad_shouldSetTheTableDataSource() { // Arrange // Act loadView() // Assert XCTAssertTrue(target.tableView.dataSource === dataSource) }

Slide 18

Slide 18 text

func test_viewDidLoad_shouldSetTheHandlersToTheTableDataSource() { // Arrange // Act loadView() // Assert XCTAssertNotNil(dataSource.handlers) } ViewDidLoadͰઃఆ͞ΕΔ΋ͷ

Slide 19

Slide 19 text

• ϥϕϧͷςΩετ • αϒϏϡʔͷঢ়ଶ • ͳͲ

Slide 20

Slide 20 text

ઃఆɺߦಈͳͲΛςετͯ͠ ࢓༷௨ΓʹͰ͖ͯΔ͔ ֬ೝͰ͖·͢

Slide 21

Slide 21 text

Կ͔Πϕϯτ͋ͬͨ࣌ func test_textChanded_shouldCallValidateText() { // Arrange // Act dataSource.handlers?.textChangeHandler("newText") // Assert XCTAssertTrue(validatorSpy.validateTextCalled) }

Slide 22

Slide 22 text

Կ͔Πϕϯτ͋ͬͨ࣌ func test_buttonPushed_labelTextShouldBe_New() { // Arrange // Act target.newButtonPush(nil) // Assert XCTAssertTrue(target.label.text, "New") }

Slide 23

Slide 23 text

UITableViewControllerͷ৔߹ɺ DataSourceɺDelegateͷςετ΋Ͱ͖·͢ɻ

Slide 24

Slide 24 text

protocolͷ֤ؔ਺ͷςετͰ͖·͢ func test_numberOfSections_shouldReturn6() { // Arrange // Act let numberOfSections = target.numberOfSections(in: tableViewController.tableView) // Assert XCTAssertEqual(numberOfSections, 6) }

Slide 25

Slide 25 text

protocolͷ֤ؔ਺ͷςετͰ͖·͢ func test_numberOfRowsInSection_section1_shouldReturn2() { // Arrange // Act let numberOfRows = target.tableView(tableViewController.tableView, numberOfRowsInSection: 1) // Assert XCTAssertEqual(numberOfRows, 2) }

Slide 26

Slide 26 text

protocolͷ֤ؔ਺ͷςετͰ͖·͢ func test_cellForRowAt_row0Section5_shouldBeButtonCell() { // Arrange let indexPath = IndexPath(row: 0, section: 5) // Act let cell = target.tableView(tableViewController.tableView, cellForRowAt: indexPath) // Assert XCTAssertTrue(cell is ButtonCell) }

Slide 27

Slide 27 text

UITableViewͷΦϒδΣΫτ͕ඞཁ ViewController͝ͱ࡞ͬͯɺϏϡʔΛϩʔυ͢Δ

Slide 28

Slide 28 text

ςʔϒϧͷߏ੒ɺ
 ηϧͷछྨ΍ઃఆͳͲͷ ςετ͕Ͱ͖·͢

Slide 29

Slide 29 text

·ͱΊ • ViewController΍DataSourceͳͲͷςετ͸Մೳ • ςετΛॻ͘͜ͱͰ࢓༷௨Γʹಈ͍ͯΔͷࣗಈ తʹ֬ೝͰ͖Δ • ҆৺ͯ͠ϦϑΝΫτϦϯάͰ͖Δ

Slide 30

Slide 30 text

·ͱΊ • ࢓༷͕มΘΔͱςετͷमਖ਼͕ඞཁ • ςετΛॻ͘͜ͱ΋͔͔࣌ؒΓ·͢