Slide 1

Slide 1 text

9DPEF1SFWJFXT͔Β 4OBQTIPUςετΛࣗಈੜ੒͢Δ LFONB[ !NFSQBZ .FSQBZ5FDI5BMLGPSJ04&OHJOFFST NFSQBZ@UFDIUBML

Slide 2

Slide 2 text

ࠓ೔͓࿩͢͠Δ಺༰ w 9DPEF1SFWJFXTΛ࢖ͬͨ7JFXͷ։ൃͷ֓ཁ w 4OBQTIPUςετͷ֓ཁͱ՝୊ w 9DPEF1SFWJFXT͔Β4OBQTIPUςετΛࣗಈੜ੒͢Δ w σϞ

Slide 3

Slide 3 text

9DPEF1SFWJFXTΛ࢖ͬͨ7JFXͷ։ൃ

Slide 4

Slide 4 text

9DPEF1SFWJFXTͰ6*,JUϕʔεͷΞϓϦ։ൃΛޮ཰Խ͢ΔJ04%$+BQBO

Slide 5

Slide 5 text

final class ConfirmationStateView: UIView, .. { struct Input { let screenName: String } private lazy var screenNameLabel: UILabel = { let label = UILabel(...) .... return label }() func apply(input: Input) { screenNameLabel.text = input.screenName ... } 7JFXίʔυ 6*7JFX

Slide 6

Slide 6 text

struct Wrapper: UIViewRepresentable { let input: ConfirmationStateView.Input init(input: ConfirmationStateView.Input) { self.input = input } func makeUIView(...) -> ConfirmationStateView { let view = ConfirmationStateView() view.apply(input: input) return view } func updateUIView(...) { } } 7JFXίʔυΛ4XJGU6*ͷ7JFXͱͯ͠ϥοϓ

Slide 7

Slide 7 text

struct ConfirmationStateViewPreview: PreviewProvider { static var previews: some View { Group { Wrapper( input: .init(screenName: "୹໊͍લ") ) Wrapper( input: .init(screenName: "গ͠௕໊͍લগ͠௕໊͍લ") ) Wrapper( input: .init(screenName: "௕໊͍લ௕໊͍લ௕໊͍લ௕໊͍લ௕໊͍લ") ) 1SFWJFXίʔυ 1SFWJFX1SPWJEFS

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

4OBQTIPUςετ IUUQTHJUIVCDPNQPJOUGSFFDPTXJGUTOBQTIPUUFTUJOH

Slide 10

Slide 10 text

import XCTest import SnapshotTesting class ConfirmationStateViewTests: XCTestCase { func testShortName() { let view = ConfirmationStateView() let input = ConfirmationStateView.Input( screenName: "୹໊͍લ" ) view.apply(input: input) assertSnapshot(matching: view, as: .image) } func testMiddleName() { ... screenName: "গ͠௕໊͍લগ͠௕໊͍લ" ... assertSnapshot(matching: view, as: .image) } func testLongName() { ... screenName: "௕໊͍લ௕໊͍લ௕໊͍લ௕໊͍લ௕໊͍લ" ... assertSnapshot(matching: view, as: .image) } 4OBQTIPUςετίʔυ 7JFXΛΩϟϓνϟͯ͠ ࢀরը૾ϑΝΠϧͱͯ͠ อଘ ൺֱ ࢀরը૾

Slide 11

Slide 11 text

4OBQTIPUςετͷ՝୊ w 4OBQTIPUςετʹݶΒͣɺςετίʔυͷهड़ʹ͸ίετ͕͔͔Δ

Slide 12

Slide 12 text

import XCTest import SnapshotTesting class ConfirmationStateViewTests: XCTestCase { func testShortName() { let view = ConfirmationStateView() let input = ConfirmationStateView.Input( screenName: "୹໊͍લ" ) view.apply(input: input) assertSnapshot(matching: view, as: .image) } func testMiddleName() { ... screenName: "গ͠௕໊͍લগ͠௕໊͍લ" ... assertSnapshot(matching: view, as: .image) } func testLongName() { ... screenName: "௕໊͍લ௕໊͍લ௕໊͍લ௕໊͍લ௕໊͍લ" ... assertSnapshot(matching: view, as: .image) } 1SFWJFXίʔυ 4OBQTIPUςετίʔυ ಉ͡Α͏ͳ͜ͱΛ΍͍ͬͯΔ

Slide 13

Slide 13 text

1SFWJFXίʔυ 4OBQTIPUςετίʔυ 1SFWJFXର৅ͷ7JFXΛɺͦͷ·· 4OBQTIPUςετͷର৅ͱͯ͠ѻ͏

Slide 14

Slide 14 text

1SFWJFXίʔυʹର͢Δ4OBQTIPUςετ class PreviewSnapshotTests: XCTestCase { func testConfirmationStateViewPreview() { for preview in ConfirmationStateViewPreview._allPreviews { assertSnapshot(matching: preview.content, as: .image) } } } FYUFOTJPO@1SFWJFX1SPWJEFS\ QVCMJDTUBUJDWBS@BMM1SFWJFXT<4XJGU6*@1SFWJFX>\HFU^ QVCMJDTUSVDU@1SFWJFX\ QVCMJDWBSDPOUFOU4XJGU6*"OZ7JFX\HFU^ 1SFWJFXίʔυதʹఆٛ͞ΕͨશͯͷϓϨϏϡʔ ֤ϓϨϏϡʔͷදࣔ಺༰Λࣔ͢4XJGU6*ͷ7JFX

Slide 15

Slide 15 text

class PreviewSnapshotTests: XCTestCase { func testConfirmationStateViewPreview() { for preview in ConfirmationStateViewPreview._allPreviews { assertSnapshot(matching: preview.content, as: .image) } } }

Slide 16

Slide 16 text

4PVSDFSZʹΑΔ4OBQTIPUςετίʔυͷࣗಈੜ੒ class PreviewSnapshotTests: XCTestCase { {% for type in types.based.PreviewProvider %} func test{{type.name}}() { for preview in T._allPreviews { assertSnapshot(matching: preview.content, as: .image) } } {% endfor %} } TUFODJMςϯϓϨʔτ IUUQTHJUIVCDPNLS[ZT[UPG[BCMPDLJ4PVSDFSZ UZQFTCBTFE1SFWJFX1SPWJEFS 1SFWJFX1SPWJEFSϓϩτίϧʹద߹ͨ͠શͯͷܕΛऔಘ

Slide 17

Slide 17 text

9DPEF1SFWJFXT͔Β4OBQTIPUςετΛࣗಈੜ੒͢Δ

Slide 18

Slide 18 text

σϞ

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

$*΁ͷ૊ΈࠐΈ 1VTI࣌ʹ$*্Ͱ4OBQTIPUςετΛࣗಈ࣮ߦ

Slide 21

Slide 21 text

$*΁ͷ૊ΈࠐΈ (JUIVCϥϕϧΛ࢖ͬͨ࠶Ωϟϓνϟ (JUIVCϥϕϧΛઃఆ $*্Ͱࢀরը૾Λ࠶౓Ωϟϓνϟ ࠩ෼͕͋Ε͹1VMM3FRVFTU࡞੒ ։ൃऀ͕֬ೝͯ͠໰୊ͳ͚Ε͹Ϛʔδ

Slide 22

Slide 22 text

·ͱΊ w 1SFWJFXίʔυΛ΋ͱʹ4OBQTIPUςετΛࣗಈੜ੒͢Δ࢓૊ΈΛߏங w 1SFWJFXίʔυΛ͖ͪΜͱॻ͚͹ॻ͘΄Ͳɺςετέʔε͕ॆ࣮͢Δ w Ұੴೋௗͳ࢓૊Έ w 6*,JU4XJGU6*͍ͣΕʹ΋ద༻Ͱ͖Δ w .FSQBZ"EWFOU$BMFOEBSͷهࣄ΋͝ࢀর͍ͩ͘͞