Slide 1

Slide 1 text

୯ମςετͷϋδϝ !ZPLPZBT UXJUUFS*%ZPLPZBT

Slide 2

Slide 2 text

ࣗݾ঺հ ˙ OBNFZPLPZBT ˙ UXJUUFS*%ZPLPZBT ˙ KPCגࣜձࣾNJYJͰJ04ΤϯδχΞ΍͍ͬͯ·͢

Slide 3

Slide 3 text

୯ମςετͷൃද͕গͳ͍ͱ ฉ͍ͨͷͰɺ ୯ମςετͷ࿩Λ͠·͢

Slide 4

Slide 4 text

ʮςετ͍ͨ͜͠ͱʯ ͸ԿͰ͠ΐ͏͔

Slide 5

Slide 5 text

doSomething(x) Ҿ਺ ໭Γ஋ ςετ͍ͨ͜͠ͱ ˙ ᶃ໌ࣔతͳೖग़ྗ

Slide 6

Slide 6 text

doSomething(x) Ҿ਺ ໭Γ஋ ςετ͕ॻ͖΍͍͢ ςετ͍ͨ͜͠ͱ ˙ ᶃ໌ࣔతͳೖग़ྗ

Slide 7

Slide 7 text

ςετ͍ͨ͜͠ͱ ˙ ᶄ҉໧తͳೖग़ྗ େҬม਺ͳͲ ଞͷςετ͕յ͔͢΋ ଞͷςετΛյ͔͢΋ େҬม਺ͳͲ doSomething(x) Ҿ਺ ໭Γ஋

Slide 8

Slide 8 text

ςετ͍ͨ͜͠ͱ ˙ ᶄ҉໧తͳೖग़ྗ େҬม਺ͳͲ ଞͷςετ͕յ͔͢΋ ଞͷςετΛյ͔͢΋ େҬม਺ͳͲ doSomething(x) Ҿ਺ ໭Γ஋ ςετ͕ॻ͖΍͍͢ʜ

Slide 9

Slide 9 text

ςετ͍ͨ͜͠ͱ ˙ ҉໧తͳೖग़ྗ େҬม਺ͳͲ େҬม਺ͳͲ doSomething(x) Ҿ਺ ໭Γ஋ ଞͷςετ͕յ͔͢΋ ଞͷςετΛյ͔͢΋

Slide 10

Slide 10 text

ςετ͍ͨ͜͠ͱ ˙ ҉໧తͳೖग़ྗ େҬม਺ͳͲ େҬม਺ͳͲ doSomething(x) Ҿ਺ ໭Γ஋ ଞͷςετ͕յ͔͢΋ ଞͷςετΛյ͔͢΋ ͭΒ͍

Slide 11

Slide 11 text

ςετ͍ͨ͜͠ͱ ˙ ҉໧తͳೖग़ྗ େҬม਺ͳͲ େҬม਺ͳͲ doSomething(x) Ҿ਺ ໭Γ஋ ଞͷςετ͕յ͔͢΋ ଞͷςετΛյ͔͢΋ ྫ͑͹Ͳ͏͍͏ςετʁ

Slide 12

Slide 12 text

҉໧తͳೖग़ྗͷςετྫ ˙ 6TFS%FGBVMUT͔Βऔಘͨ͠஋Λ࢖͏ؔ਺Λςετ͢Δ৔߹ class HogeTests: XCTestCase { func testHoge() { UserDefaults.resetStandardUserDefaults() let testValue = 10 UserDefaults.standard.set(testValue, forKey: "hoge") // something to do... UserDefaults.standard.removeObject(forKey: "hoge") } }

Slide 13

Slide 13 text

class HogeTests: XCTestCase { func testHoge() { UserDefaults.resetStandardUserDefaults() let testValue = 10 UserDefaults.standard.set(testValue, forKey: "hoge") // something to do... UserDefaults.standard.removeObject(forKey: "hoge") } } ҉໧తͳೖग़ྗͷςετྫ ˙ 6TFS%FGBVMUT͔Βऔಘͨ͠஋Λ࢖͏ؔ਺Λςετ͢Δ৔߹ ຊମίʔυɺ΋͘͠͸ଞͷςετ͔Β มߋ͞Ε͍ͯΔՄೳੑ͕͋ΔͷͰɺ 6TFS%FGBVMUTΛॳظঢ়ଶʹ͔ͯ͠Βελʔτ

Slide 14

Slide 14 text

class HogeTests: XCTestCase { func testHoge() { UserDefaults.resetStandardUserDefaults() let testValue = 10 UserDefaults.standard.set(testValue, forKey: "hoge") // something to do... UserDefaults.standard.removeObject(forKey: "hoge") } } ҉໧తͳೖग़ྗͷςετྫ ˙ 6TFS%FGBVMUT͔Βऔಘͨ͠஋Λ࢖͏ؔ਺Λςετ͢Δ৔߹ ςετΛߦ͏ͨΊʹʮࣄલʹೖ͍ͬͯͯཉ͍͠஋ʯΛ 6TFS%FGBVMUTʹ௚઀ॻ͖ࠐΉ

Slide 15

Slide 15 text

class HogeTests: XCTestCase { func testHoge() { UserDefaults.resetStandardUserDefaults() let testValue = 10 UserDefaults.standard.set(testValue, forKey: "hoge") // something to do... UserDefaults.standard.removeObject(forKey: "hoge") } } ҉໧తͳೖग़ྗͷςετྫ ˙ 6TFS%FGBVMUT͔Βऔಘͨ͠஋Λ࢖͏ؔ਺Λςετ͢Δ৔߹ ຊମίʔυɺ΋͘͠͸ଞͷςετ΁
 ӨڹΛ༩͑ͳ͍ͨΊʹɺ 6TFS%FGBVMUTʹՃ͑ͨมߋΛऔΓফ͢

Slide 16

Slide 16 text

҉໧తͳೖग़ྗͷςετྫ ˙ 6TFS%FGBVMUTΛ௚઀৮Δͱ͕͜͜ਏ͍ ɾ༩͑ͨมߋΛফ͠๨ΕΔͱɺຊମ࣮ߦ࣌΍ଞͷςετʹӨڹ͢Δ ɾςετߦ͏ͱ΋Εͳ͘ ʮ6TFS%FGBVMUT΁ͷૢ࡞෭࡞༻ʯ͕ੜͯ͡͠·͏ ෭࡞༻ͳ͘ςετ͍ͨ͠ʂ

Slide 17

Slide 17 text

෭࡞༻ͳ͘ςετΛߦ͏ͨΊʹ ˙ ҉໧తͳೖग़ྗ େҬม਺ͳͲ େҬม਺ͳͲ doSomething(x) Ҿ਺ ໭Γ஋ ελϒͱ͍͏ख๏ Λ࢖͍·͢ εύΠͱ͍͏ख๏ Λ࢖͍·͢

Slide 18

Slide 18 text

҉໧తೖྗͷςετΛ ͢ΔͨΊʹελϒΛ࢖͏ ຊ୊ͦͷ̍

Slide 19

Slide 19 text

doSomething(x) Ҿ਺ େҬม਺ͳͲ ࣄલʹઃఆͨ͠ৼΔ෣͍Λ͢Δ
 ِ෺ͷΦϒδΣΫτ ελϒ ໭Γ஋ ˞ࢲ͕͜Ε͔Βઆ໌͢ΔʮελϒʯͷৼΔ෣͍͸্هͷ΋ͷ ʹͳΓ·͢ ಉ໊ͰผͷఆٛΛࢦ͢͜ͱ΋͋ΔͨΊ ҉໧తೖྗͷςετΛ͢ΔͨΊʹελϒΛ࢖͏

Slide 20

Slide 20 text

҉໧తೖྗͷςετΛ͢ΔͨΊʹελϒΛ࢖͏ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋ class Input { func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int }

Slide 21

Slide 21 text

҉໧తೖྗͷςετΛ͢ΔͨΊʹελϒΛ࢖͏ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋ class Input { func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } େҬม਺͔Βऔಘ͍ͯ͠Δ

Slide 22

Slide 22 text

҉໧తೖྗͷςετΛ͢ΔͨΊʹελϒΛ࢖͏ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋ class Input { func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } େҬม਺͔Βऔಘ͍ͯ͠Δ ςετ࣌͸ِ෺ʹࠩ͠ସ͍͑ͨ

Slide 23

Slide 23 text

҉໧తೖྗͷςετΛ͢ΔͨΊʹελϒΛ࢖͏ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋ class Input { func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } େҬม਺͔Βऔಘ͍ͯ͠Δ ςετ࣌͸ِ෺ʹࠩ͠ସ͍͑ͨ ελϒΛ࢖͍͍ͨ

Slide 24

Slide 24 text

҉໧తೖྗͷςετΛ͢ΔͨΊʹελϒΛ࢖͏ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋ class Input { func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } ςετ࣌͸ِ෺ʹࠩ͠ସ͍͑ͨ ελϒΛ࢖͍͍ͨ ελϒΛ࢖͑Δঢ়ଶʹ͢Δʂ େҬม਺͔Βऔಘ͍ͯ͠Δ

Slide 25

Slide 25 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ multiplication(int:) Ҿ਺ 6TFS%FGBVMUT ελϒ ໭Γ஋ 6TFS%FGBVMU͔Β௚઀औಘ͸ͤͣʹɺ
 ৼΔ෣͍Λ੍ޚͰ͖ΔΦϒδΣΫτΛڬΉ

Slide 26

Slide 26 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ ᶃ੍ޚ͍ͨ͠ৼΔ෣͍Λ1SPUPDPMʹ͢Δ protocol ReadableRepositoryContract { func read() -> Int }

Slide 27

Slide 27 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ ᶄ1SPUPDPMʹ४ڌͨ͠ΫϥεΛ࡞੒͢Δ class ReadableRepository: ReadableRepositoryContract { func read() -> Int { return UserDefaults.standard.integer(forKey: "base") } }

Slide 28

Slide 28 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ class Input { func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } }

Slide 29

Slide 29 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ class Input { private let repository: ReadableRepositoryContract func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } } ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 30

Slide 30 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ class Input { private let repository: ReadableRepositoryContract init (repository: ReadableRepositoryContract) { self.repository = repository } func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } } ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 31

Slide 31 text

ελϒΛ࢖͑Δঢ়ଶʹ͢Δ class Input { private let repository: ReadableRepositoryContract init (repository: ReadableRepositoryContract) { self.repository = repository } func multiplication(int: Int) -> Int { let base = UserDefaults.standard.integer(forKey: “base") return base * int } } ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 32

Slide 32 text

class Input { private let repository: ReadableRepositoryContract init (repository: ReadableRepositoryContract) { self.repository = repository } func multiplication(int: Int) -> Int { let base = self.repository.read() return base * int } } ελϒΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 33

Slide 33 text

class Input { private let repository: ReadableRepositoryContract init (repository: ReadableRepositoryContract) { self.repository = repository } func multiplication(int: Int) -> Int { let base = self.repository.read() return base * int } } ελϒΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋

Slide 34

Slide 34 text

class Input { private let repository: ReadableRepositoryContract init (repository: ReadableRepositoryContract) { self.repository = repository } func multiplication(int: Int) -> Int { let base = self.repository.read() return base * int } } ελϒΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తೖྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ ˙ ཁ݅6TFS%FGBVMUT͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋ ˙ ཁ݅3FQPTJUPSZ͔Βऔಘͨ͠஋ *OU Ҿ਺໭Γ஋

Slide 35

Slide 35 text

ελϒΛ࢖͏४උ͸Ͱ͖ͨ

Slide 36

Slide 36 text

ελϒΛ࢖ͬͯςετΛॻ͘ ελϒΛ࢖͏४උ͸Ͱ͖ͨ

Slide 37

Slide 37 text

ελϒΛ࢖ͬͯςετΛॻ͘ class ReadableRepositoryStub: ReadableRepositoryContract { private let base: Int init(base: Int) { self.base = base } func read() -> Int { return self.base } } 1SPUPDPMʹ४ڌͨ͠ελϒΛ࡞੒͢Δ

Slide 38

Slide 38 text

class ReadableRepositoryStub: ReadableRepositoryContract { private let base: Int init(base: Int) { self.base = base } func read() -> Int { return self.base } } ελϒΛ࢖ͬͯςετΛॻ͘ 1SPUPDPMʹ४ڌͨ͠ελϒΛ࡞੒͢Δ ʮِ෺ͷৼΔ෣͍ʯΛߦͳ͍ͬͯΔՕॴ

Slide 39

Slide 39 text

class InputTests: XCTestCase { func testMultiplication() { let base = 5 let int = 2 let expected = 10 } } ˙ ςετέʔε ɾظ଴͕ฦͬͯ͘Δ ελϒΛ࢖ͬͯςετΛॻ͘ ɾঢ়گCBTF JOUͷ࣌

Slide 40

Slide 40 text

class InputTests: XCTestCase { func testMultiplication() { let base = 5 let int = 2 let expected = 10 let repositoryStub = ReadableRepositoryStub(base: base) let input = Input(repository: repositoryStub) } } ɾঢ়گCBTF JOUͷ࣌ ˙ ςετέʔε ɾظ଴͕ฦͬͯ͘Δ ελϒΛ࢖ͬͯςετΛॻ͘ ελϒΛࠩ͠ࠐΉ

Slide 41

Slide 41 text

class InputTests: XCTestCase { func testMultiplication() { let base = 5 let int = 2 let expected = 10 let repositoryStub = ReadableRepositoryStub(base: base) let input = Input(repository: repositoryStub) let actual = input.multiplication(int: int) XCTAssertEqual(actual, expected) } } ɾঢ়گJOU CBTFͷ࣌ ˙ ςετέʔε ɾظ଴͕ฦͬͯ͘Δ ελϒΛ࢖ͬͯςετΛॻ͘ தͰελϒ͕࢖ΘΕ͍ͯΔ

Slide 42

Slide 42 text

ελϒ׬

Slide 43

Slide 43 text

҉໧తग़ྗͷςετΛ ͢ΔͨΊʹεύΠΛ࢖͏ ຊ୊ͦͷ̎

Slide 44

Slide 44 text

doSomething(x) Ҿ਺ ໭Γ஋ େҬม਺ͳͲ ِ෺ͷؔ਺΍ΦϒδΣΫτͰɺ
 ݺͼग़͠΍ࣗ਎΁ͷมߋΛه࿥͢Δ εύΠ ҉໧తग़ྗͷςετΛ͢ΔͨΊʹεύΠΛ࢖͏

Slide 45

Slide 45 text

҉໧తग़ྗͷςετΛ͢ΔͨΊʹεύΠΛ࢖͏ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ class Output { func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } }

Slide 46

Slide 46 text

class Output { func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } ҉໧తग़ྗͷςετΛ͢ΔͨΊʹεύΠΛ࢖͏ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ େҬม਺΁ه࿥͍ͯ͠Δ

Slide 47

Slide 47 text

class Output { func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } ҉໧తग़ྗͷςετΛ͢ΔͨΊʹεύΠΛ࢖͏ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ େҬม਺΁ه࿥͍ͯ͠Δ ςετ࣌͸ผͷ৔ॴʹه࿥͍ͨ͠

Slide 48

Slide 48 text

class Output { func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } ҉໧తग़ྗͷςετΛ͢ΔͨΊʹεύΠΛ࢖͏ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ େҬม਺΁ه࿥͍ͯ͠Δ ςετ࣌͸ผͷ৔ॴʹه࿥͍ͨ͠ εύΠΛ࢖͍͍ͨ

Slide 49

Slide 49 text

class Output { func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } ҉໧తग़ྗͷςετΛ͢ΔͨΊʹεύΠΛ࢖͏ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ େҬม਺΁ه࿥͍ͯ͠Δ ςετ࣌͸ผͷ৔ॴʹه࿥͍ͨ͠ εύΠΛ࢖͍͍ͨ εύΠΛ࢖͑Δঢ়ଶʹ͢Δʂ

Slide 50

Slide 50 text

save(int:) Ҿ਺ 6TFS%FGBVMUT εύΠ εύΠΛ࢖͑Δঢ়ଶʹ͢Δ 6TFS%FGBVMU΁௚઀ه࿥͸ͤͣʹɺ
 ݺͼग़͠΍มߋΛه࿥Ͱ͖ΔΦϒδΣΫτΛڬΉ

Slide 51

Slide 51 text

εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶃه࿥͍ͨ͠ৼΔ෣͍Λ1SPUPDPMʹ͢Δ protocol WritableRepositoryContract { func write(int: Int) }

Slide 52

Slide 52 text

εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶄ1SPUPDPMʹ४ڌͨ͠ΫϥεΛ࡞੒ class WritableRepository: WritableRepositoryContract { func write(int: Int) { UserDefaults.standard.set(int, forKey: “write") } }

Slide 53

Slide 53 text

ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ εύΠΛ࢖͑Δঢ়ଶʹ͢Δ class Output { func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } }

Slide 54

Slide 54 text

class Output { private let repository: WritableRepositoryContract func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 55

Slide 55 text

class Output { private let repository: WritableRepositoryContract init(repository: WritableRepositoryContract) { self.repository = repository } func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 56

Slide 56 text

class Output { private let repository: WritableRepositoryContract init(repository: WritableRepositoryContract) { self.repository = repository } func write(int: Int) { UserDefaults.standard.set(int, forKey: "write") } } εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 57

Slide 57 text

class Output { private let repository: WritableRepositoryContract init(repository: WritableRepositoryContract) { self.repository = repository } func write(int: Int) { self.repository.write(int: int) } } εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ

Slide 58

Slide 58 text

class Output { private let repository: WritableRepositoryContract init(repository: WritableRepositoryContract) { self.repository = repository } func write(int: Int) { self.repository.write(int: int) } } εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ

Slide 59

Slide 59 text

class Output { private let repository: WritableRepositoryContract init(repository: WritableRepositoryContract) { self.repository = repository } func write(int: Int) { self.repository.write(int: int) } } εύΠΛ࢖͑Δঢ়ଶʹ͢Δ ᶅ҉໧తग़ྗͷՕॴͰ͸1SPUPDPMΛར༻͢ΔΑ͏ʹมߋ͢Δ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ6TFS%FGBVMUTʹอଘ͢Δ ˙ ཁ݅Ҿ਺Ͱड͚औͬͨ஋Λ3FQPTJUPSZʹ౉͢

Slide 60

Slide 60 text

εύΠΛ࢖͏४උ͸Ͱ͖ͨ

Slide 61

Slide 61 text

εύΠΛ࢖ͬͯςετΛॻ͘ εύΠΛ࢖͏४උ͸Ͱ͖ͨ

Slide 62

Slide 62 text

εύΠΛ࢖ͬͯςετΛॻ͘ 1SPUPDPMʹ४ڌͨ͠εύΠΛ࡞੒͢Δ class WritableRepositorySpy: WritableRepositoryContract { /// ϝιου͕ݺͼग़͞ΕͨࡍͷҾ਺ྻɻ private(set) var callArguments: [Int] = [] func write(int: Int) { self.record(int) } private func record(_ args: Int) { self.callArguments += [args] } }

Slide 63

Slide 63 text

class WritableRepositorySpy: WritableRepositoryContract { /// ϝιου͕ݺͼग़͞ΕͨࡍͷҾ਺ྻɻ private(set) var callArguments: [Int] = [] func write(int: Int) { self.record(int) } private func record(_ args: Int) { self.callArguments += [args] } } εύΠΛ࢖ͬͯςετΛॻ͘ ϓϩτίϧ४ڌ 1SPUPDPMʹ४ڌͨ͠εύΠΛ࡞੒͢Δ

Slide 64

Slide 64 text

class WritableRepositorySpy: WritableRepositoryContract { /// ϝιου͕ݺͼग़͞ΕͨࡍͷҾ਺ྻɻ private(set) var callArguments: [Int] = [] func write(int: Int) { self.record(int) } private func record(_ args: Int) { self.callArguments += [args] } } εύΠΛ࢖ͬͯςετΛॻ͘ ݺͼग़͠Λه࿥͢Δ 1SPUPDPMʹ४ڌͨ͠εύΠΛ࡞੒͢Δ

Slide 65

Slide 65 text

εύΠΛ࢖ͬͯςετΛॻ͘ ɾঢ়گJOUͷ࣌ ˙ ςετέʔε ɾظ଴6TFS%FGBVMUT΁lz͕อଘ͞ΕΔ class OutputTests: XCTestCase { func testWrite() { let int = 2 } }

Slide 66

Slide 66 text

εύΠΛ࢖ͬͯςετΛॻ͘ ɾঢ়گJOUͷ࣌ ˙ ςετέʔε ɾظ଴6TFS%FGBVMUT΁lz͕อଘ͞ΕΔ class OutputTests: XCTestCase { func testWrite() { let int = 2 let spy = WritableRepositorySpy() let output = Output(repository: spy)
 } } εύΠΛࠩ͠ࠐΉ

Slide 67

Slide 67 text

εύΠΛ࢖ͬͯςετΛॻ͘ ɾঢ়گJOUͷ࣌ ˙ ςετέʔε ɾظ଴6TFS%FGBVMUT΁lz͕อଘ͞ΕΔ class OutputTests: XCTestCase { func testWrite() { let int = 2 let spy = WritableRepositorySpy() let output = Output(repository: spy)
 output.write(int: int) XCTAssertEqual(int, spy.callArguments.first!) } } தͰεύΠ͕࢖ΘΕ͍ͯΔ

Slide 68

Slide 68 text

εύΠΛ࢖ͬͯςετΛॻ͘ ɾঢ়گJOUͷ࣌ ˙ ςετέʔε ɾظ଴6TFS%FGBVMUT΁lz͕อଘ͞ΕΔ class OutputTests: XCTestCase { func testWrite() { let int = 2 let spy = WritableRepositorySpy() let output = Output(repository: spy)
 output.write(int: int) XCTAssertEqual(int, spy.callArguments.first!) } } εύΠʹه࿥͞Εͨ஋Λ֬ೝ͢Δ

Slide 69

Slide 69 text

εύΠ׬

Slide 70

Slide 70 text

·ͱΊ ˙ ҉໧తೖग़ྗ͕͋Δ৔߹ ɾೖྗ ɾِ෺ʹࠩ͠ସ͑ΒΕΔͱςετͷ४උָ͕ʹͳΔΑ ɾग़ྗ ɾʮ6TFS%FGBVMUTʹ΂ͬͨΓґଘʯͳΜͯ͜ͱ͕ແ͘ͳΔΑ ɾ1SPUPDPMΛ࢖ͬͯελϒ औಘ༻ͷِ෺ Λ ɹࠩ͠ࠐΊΔΑ͏ʹ͠Α͏ ɾ1SPUPDPMΛ࢖ͬͯεύΠ ه࿥༻ͷِ෺ Λ ɹࠩ͠ࠐΊΔΑ͏ʹ͠Α͏ ˙ ϝϦοτ

Slide 71

Slide 71 text

&OKPZ5FTU%BZT