Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SwiftにおけるMockライブラリの活用/swift-mock-library
Search
Yusuke Hosonuma
March 27, 2018
Programming
6.7k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SwiftにおけるMockライブラリの活用/swift-mock-library
iOS Test Night #7 での発表.
https://testnight.connpass.com/event/79163/
Yusuke Hosonuma
March 27, 2018
More Decks by Yusuke Hosonuma
See All by Yusuke Hosonuma
KotlinTest で始める Property-based Testing/kotlintest-property-based-testing
yusukehosonuma
2
1.6k
Marzipan の正体は何だったのか そして SwiftUI の衝撃/wwdc19_marzipan_swiftui
yusukehosonuma
2
990
標準パッケージにおけるテストでの利用例から学ぶ testing / quick パッケージ/golang-testing-quick
yusukehosonuma
4
12k
Swift で ParameterizedTest をやってみた話/swift-parameterized-test
yusukehosonuma
4
2.3k
Property-based test beginning with SwiftCheck
yusukehosonuma
1
6.3k
XCTest(再)入門/reintroduction-to-xctest
yusukehosonuma
0
670
ソースコードから読み解く - Quick はどのように実装されているのか?/quick-code-reading
yusukehosonuma
7
11k
Swift 4.2 はどのような進化をしているのか/whats-new-swift42
yusukehosonuma
16
15k
HTTPモックライブラリ「Mockingjay」を使ってみた話/swift-mockingjay
yusukehosonuma
5
4.4k
Other Decks in Programming
See All in Programming
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
6.9k
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
390
自サークルのIdPからログアウトできるようになるまで
taiseiue
0
110
wkhtmltopdfの次どうするか問題2026
willnet
2
1.9k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
220
APNsからLive Activityを開始する話
yumnumm
0
150
Rでドレミ/Do-Re-Mi_with_R
florets1
0
120
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
310
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
110
速習iPhone Duo対応
yuukiw00w
2
960
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
130
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.6k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
Become a Pro
speakerdeck
PRO
31
6.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
How to build a perfect <img>
jonoalderson
1
6.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Odyssey Design
rkendrick25
PRO
2
860
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
350
Designing for Performance
lara
611
70k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Embracing the Ebb and Flow
colly
88
5.2k
Transcript
Copyright (C) DeNA Co.,Ltd. All Rights Reserved. iOS Test Night
#7 2018/03/26 (Mon) ࡉপ ༞հ@DeNA 4XJGUʹ͓͚Δ .PDLϥΠϒϥϦͷ׆༻ 1
˙:VTVLF)PTPOVNBʢ!UPCJʣ • ॴଐ ⁃ %F/"ɹ48&5άϧʔϓɹςετج൫νʔϜ ⁃ ςετٕज़ͷௐࠪɺࣾπʔϧ։ൃ • 'BWPSJUF ⁃
• ۙگ ⁃ USZ4XJGU"GUFS5BMLTEBZͰൃදʢ4XJGU1.Ͱ࡞Δ$-*ʣ ⁃ ,PUMJOΛ৮͚ͬͯͨͲɺ4XJGUͷྑ͞ʹ࠶ͼؾ͖ͮ࢝ΊΔ ⁃ 4XJGUͷ.PDLϥΠϒϥϦʹՄೳੑΛײ͡Δɹˡ͍·͜͜ 8IP Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 2
ࠓ͢͜ͱ 3 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
4XJGUʹ͓͚Δ .PDLϥΠϒϥϦͷ׆༻ 4 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ΞδΣϯμ 5 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDLͱ • 4XJGUʹ͓͚Δ.PDLࣄ • .PDLΛࣗͰ࡞Δ • 044ϥΠϒϥϦͷհ • ϥΠϒίʔσΟϯάʢ࣌ؒ͋Εʂʣ • ·ͱΊ
.PDLͱʁ 6 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mockͱʁ 7 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
ຊͰͳِ͍ͷΦϒδΣΫτʢςετμϒϧͱʣ • ୯ମςετಈ࡞֬ೝͰར༻ • ྫ • "1*͕ະ ˠμϛʔϨεϙϯεΛฦ͢.PDL • ґଘ͕ؔෳࡶͳςετ ˠґଘΦϒδΣΫτΛ.PDLʹมߋ
Mockͷར༻ྫ 8 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Waiter
CockProtocol RealCock ΣΠλʔ ྉཧਓ1SPUPDPM ྉཧਓ
Mockͷར༻ྫ 9 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Waiter
CockProtocol RealCock ୯ମςετ͍ͨ͠ʜ ͚Ͳ࣮Ͱ͖ͯͳ͍ʜ
Mockͷར༻ྫ 10 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Waiter
CockProtocol MockCock ςετ༻ͷِΦϒδΣΫτ
MockͰԿ͕Ͱ͖Δʁ 11 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
͋Δ"1*ݺͼग़࣌͠ʹɺҙͷΛฦ͢ • ಈ࡞֬ೝ༻ͷ"1*Ϩεϙϯε • ྫ֎తͳΤϥʔ • ݺͼग़݁͠Ռͷ֬ೝ • ͋Δϝιου"͕ݺͼग़͞Ε͔ͨ • ʻճʼਖ਼͍͔͠ʁ • ʻҾʼਖ਼͍͔͠ʁ
ͳͥMockΛ͏͔ʁ 12 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
࣮ΦϒδΣΫτ͕ଘࡏ͠ͳ͍ • ࣮த • ࣮ΦϒδΣΫτΛར༻͢Δͱ͕͔͔࣌ؒΔ • ௨৴࣌ؒ • σʔλϕʔεͷΞΫηε • ґଘؔΛΓ͍ͨ͠߹ • ୯ମςετ
͜͜·Ͱ 13 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDLʹِͷΦϒδΣΫτ • Կ͕Ͱ͖Δʁ • ҙͷΛฦ͢ • ݺͼग़݁͠Ռͷ֬ೝ • ͳͥར༻͢Δʁ • ࣮ΦϒδΣΫτ͕ଘࡏ͠ͳ͍ • ࣮ΦϒδΣΫτͩͱ͕͔͔࣌ؒΔ • ୯ମςετ UIFO3FUVSO 7FSJGZ
4XJGUʹ͓͚Δ .PDLࣄ 14 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
0CKFDUJWF$࣌ 15 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Objective-C ࣌ 16 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
• 0CKFDUJWF$ • ಈతϥϯλΠϜʢ0CKFDUJWF$3VOUJNFʣ • .FUIPE4XJ[[MJOH • .FUIPE.JTTJOH ɹɹˠϝλϓϩάϥϛϯάʢࠇຐज़ʣͷ׆༻ • 0$.PDL • 0CKFDUJWF$ʹ͓͚ΔσϑΝΫτϥΠϒϥϦ • ݴޠϥϯλΠϜΛϑϧ׆༻
4XJGU࣌ 17 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift ࣌ɹংষ 18 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
• 4XJGU • ੩తϥϯλΠϜ • ϦϑϨΫγϣϯ"1*ʢಡΈऔΓઐ༻ʣ • 0CKFDUJWF$ϥϯλΠϜͷ׆༻ݶఆత ˠϝλϓϩάϥϛϯάʢࠇຐज़ʣͷ׆༻ • 0$.PDL • ݴޠϒϦοδͰ༻Ͱ͖Δʢͦͷ༐ؾ͕͋Εʣ • 0$.PDL͕4XJGUΛશαϙʔτ͢Δ͜ͱͳ͍ ެࣜ'"2ΑΓҙ༁
Swift ࣌ɹͦΕ͔Β… 19 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
• ॳظͷΞϓϩʔν • .PDLखಈ࡞ • 3FUVSO7FSJGZΛαϙʔτ͢Δ044 • 4XJGU.PDLɹ⭐ • .PDL'JWFɹ⭐ • %PCCZɹ⭐ ɹˠ͍ͣΕ4XJGUYͰϝϯς͕ࢭ·Δ
Swift ࣌ɹͦͯ͠… 20 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
• 88%$ • 1SPUPDPM0SJFOUFE1SPHSBNNJOH͕ఏএ ˠ͞Βʹ.PDL͕ॏཁʹʜʁ • ৽͍͠Ξϓϩʔνొʂ • $VDLPP • .PDLΛࣗಈੜ • .PDLJUP +BWB ΠϯεύΠΞ ɹɹˠ͋ͱͰݟ͍ͯ͘
.PDLͷࣗ࡞ 21 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Ϋϥεਤ 22 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Waiter
CockProtocol MockCock ͜ͷ.PDLΛࣗ࡞͢Δ
ϓϩμΫτίʔυ 23 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ϓϩμΫτίʔυ 24 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. protocol
CockProtocol { func cockRamen(bowls: Int, soup: Soup) -> [Ramen] } enum Soup { case ে༉ case ຯḩ } struct Ramen { var soup: Soup } struct Waiter { let cock: CockProtocol // ґଘΦϒδΣΫτ func order() -> [Ramen] { return cock.cockRamen(bowls: 2, soup: .ে༉) } } ͜ΕΛ.PDLʹ͢Δ
.PDLίʔυ 25 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mockίʔυ 26 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
MockCock: CockProtocol { var cockRamenCallCount: Int = 0 var cockRamenLastBowls: Int = 0 var cockRamenCallReturn: [Ramen] = [] var cockRamenLastSoup: Soup = .ে༉ func cockRamen(bowls: Int, soup: Soup) -> [Ramen] { // ݺͼग़͠ճͷه cockRamenCallCount += 1 // Ҿͷه cockRamenLastBowls = bowls cockRamenLastSoup = soup // ҙͷΛฦ͢ return cockRamenCallReturn } } ݺͼग़࣌͠ͷใΛه ઃఆ͞ΕͨΓΛฦ͢
୯ମςετίʔυ 27 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
୯ମςετίʔυ 28 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { let mock = MockCock() mock.cockRamenCallReturn = [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)] let results = Waiter(cock: mock).order() XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) XCTAssertEqual(mock.cockRamenCallCount, 1) XCTAssertEqual(mock.cockRamenLastBowls, 2) XCTAssertEqual(mock.cockRamenLastSoup, .ে༉) } }
୯ମςετίʔυ 29 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { let mock = MockCock() mock.cockRamenCallReturn = [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)] let results = Waiter(cock: mock).order() XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) XCTAssertEqual(mock.cockRamenCallCount, 1) XCTAssertEqual(mock.cockRamenLastBowls, 2) XCTAssertEqual(mock.cockRamenLastSoup, .ে༉) } } ᶃDPDL3BNFO ͕ݺΕͨ࣌ʹ ͜ͷΛฦ͢Α͏ʹઃఆ
୯ମςετίʔυ 30 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { let mock = MockCock() mock.cockRamenCallReturn = [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)] let results = Waiter(cock: mock).order() XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) XCTAssertEqual(mock.cockRamenCallCount, 1) XCTAssertEqual(mock.cockRamenLastBowls, 2) XCTAssertEqual(mock.cockRamenLastSoup, .ে༉) } } ᶄPSEFS ͷݺͼग़݁͠Ռʹ͍ͭͯ ظͨ݁͠Ռ͔ݕূ
୯ମςετίʔυ 31 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { let mock = MockCock() mock.cockRamenCallReturn = [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)] let results = Waiter(cock: mock).order() XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) XCTAssertEqual(mock.cockRamenCallCount, 1) XCTAssertEqual(mock.cockRamenLastBowls, 2) XCTAssertEqual(mock.cockRamenLastSoup, .ে༉) } } ᶅ$PDLΦϒδΣΫτͷϝιου͕ ҙਤͨ͠௨Γʹݺͼग़͞Ε͔ͨݕূ
.PDLΛؚΊͨ ςετίʔυશମ 32 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
͜Ε͘Β͍ͳΒଥڠ͢Δʁ 33 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
MockCock: CockProtocol { var cockRamenCallCount: Int = 0 var cockRamenLastBowls: Int = 0 var cockRamenCallReturn: [Ramen] = [] var cockRamenLastSoup: Soup = .ে༉ func cockRamen(bowls: Int, soup: Soup) -> [Ramen] { cockRamenCallCount += 1 cockRamenLastBowls = bowls cockRamenLastSoup = soup return cockRamenCallReturn } } class WaiterTests: XCTestCase { func test_order() { let mock = MockCock() mock.cockRamenCallReturn = [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)] let results = Waiter(cock: mock).order() XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) XCTAssertEqual(mock.cockRamenCallCount, 1) XCTAssertEqual(mock.cockRamenLastBowls, 2) XCTAssertEqual(mock.cockRamenLastSoup, .ে༉) } }
͜Ε͘Β͍ͳΒଥڠ͢Δʁ 34 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
MockCock: CockProtocol { var cockRamenCallCount: Int = 0 var cockRamenLastBowls: Int = 0 var cockRamenCallReturn: [Ramen] = [] var cockRamenLastSoup: Soup = .ে༉ func cockRamen(bowls: Int, soup: Soup) -> [Ramen] { cockRamenCallCount += 1 cockRamenLastBowls = bowls cockRamenLastSoup = soup return cockRamenCallReturn } } class WaiterTests: XCTestCase { func test_order() { let mock = MockCock() mock.cockRamenCallReturn = [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)] let results = Waiter(cock: mock).order() XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) XCTAssertEqual(mock.cockRamenCallCount, 1) XCTAssertEqual(mock.cockRamenLastBowls, 2) XCTAssertEqual(mock.cockRamenLastSoup, .ে༉) } } ྫྷ੩ʹߟ͑Δͱ… ɾ1 Protocol ɾ1 Method ͦΕͳͷʹ͜ͷίʔυྔʁ
ࣗ࡞.PDLͷײ 35 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ࣗ࡞Mockͷײ 36 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
ࣗ࡞.PDL • ࡞Δͷࣗମ͘͠ͳ͍ • ͨͩϘΠϥʔϓϨʔτ͕ଟ͍PS[ • ࡞Δͷ͕໘ͩͱ • .PDLࣗମʹόάΛࠐΉ • ςετ͕ࡶʹͳΔ • ςετʹର͢ΔϞνϕʔγϣϯ%PXO ɹˠྑ͘ͳ͍ํʹߦ͘ͷʹݟ͍͑ͯΔ
4XJGUͷ .PDLϥΠϒϥϦ 37 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift ͷ MockϥΠϒϥϦ 38 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. ˒ छผ Swift Ұݴ Cuckoo 711 ࣗಈੜ 4.0 ɾMockitoΠϯεύΠΞʢࣅͯΔʣ ɾSourceKittenΛར༻ SwiftyMocky 301 ʏ 4.0 ɾSwiftyͳAPI ɾSourceryΛར༻ͯ͠ੜ Mockit 66 αϙʔτܥ 4.0 ɾMockitoΠϯεύΠΞ ɾ·ͩൃల్্ʁ Dobby 151 ʏ 2.x ɾࠓޙϝϯς͞Εͳͦ͏ʁ MockFive 201 ʏ 2.x ʏ SwiftMock 223 ʏ 2.x ʏ
.PDLJU 39 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mockit 40 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
αϒΫϥεԽʹΑΔ.PDLͷαϙʔτ • 1SPUPDPMαϙʔτ͍ͯ͠ͳ͍ʁ • .PDLͷܗࣗ࡞ • গͳ͍ίʔυྔͰ.PDLΛ࣮ݱ • ՝ • Τϥʔ࣌ʹςετίʔυʹϚʔΧʔ͕͔ͳ͍ • ·ͩൃల్্ͱ͍͏ʢݸਓͷʣҹ ࠓޙʹظͯ͠ʢ͈́
$VDLPP 41 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Cuckoo 42 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDLJUPΠϯεύΠΞ • ͔ͳΓࣅ͍ͯΔҹ • ࣗಈੜ • ϑΝΠϧΛࣗͰࢦఆ͢Δඞཁ͋Γ
Cuckoo 43 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { // ४උ let mock = MockCockProtocol() stub(mock) { stub in when(stub.cockRamen(bowls: any(), soup: any())) .thenReturn([Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)]) } // ݺͼग़͠ let results = Waiter(cock: mock).order() // ݕূ XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) verify(mock).cockRamen(bowls: equal(to: 2), soup: equal(to: .ে༉)) } ࣗಈੜ͞Εͨ.PDL
Cuckoo 44 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { // ४උ let mock = MockCockProtocol() stub(mock) { stub in when(stub.cockRamen(bowls: any(), soup: any())) .thenReturn([Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)]) } // ݺͼग़͠ let results = Waiter(cock: mock).order() // ݕূ XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) verify(mock).cockRamen(bowls: equal(to: 2), soup: equal(to: .ে༉)) } DPDL3BNFO ͕ݺͼग़͞Εͨ࣌ͷ μϛʔͷΓΛઃఆ DPDL3BNFO ͷݺͼग़͠Ҿ͕ ҙਤͨ͠ͷ͔ݕূʢWFSJGZʣ
Cuckoo 45 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { // ४උ let mock = MockCockProtocol() stub(mock) { stub in when(stub.cockRamen(bowls: any(), soup: any())) .thenReturn([Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)]) } // ݺͼग़͠ let results = Waiter(cock: mock).order() // ݕূ XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) verify(mock).cockRamen(bowls: equal(to: 2), soup: equal(to: .ে༉)) } .PDLJUPϥΠΫͳ"1* .BUDIFSΛ࠾༻
4XJGUZ.PDLZ 46 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
SwiftyMocky 47 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDLJUPϥΠΫ • ߟ͑ํࣅ͍ͯΔ • 4XJGUZͳ"1* • ίʔυิ͕ޮ͖͍͢"1*ઃܭ • ࣗಈੜ • NPDLZZNM͔Βੜ • ϑΝΠϧࢹΛαϙʔτ • 4PVSDFSZΛ෦తʹར༻
SwiftyMocky 48 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { // ४උ let mock = CockProtocolMock() mock.given(.cockRamen(bowls: .any, soup: .any, willReturn: [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)])) // ݺͼग़͠ let results = Waiter(cock: mock).order() // ݕূ XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) mock.verify(.cockRamen(bowls: .value(2), soup: .value(.ে༉))) } } ࣗಈੜ͞Εͨ.PDL
SwiftyMocky 49 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { // ४උ let mock = CockProtocolMock() mock.given(.cockRamen(bowls: .any, soup: .any, willReturn: [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)])) // ݺͼग़͠ let results = Waiter(cock: mock).order() // ݕূ XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) mock.verify(.cockRamen(bowls: .value(2), soup: .value(.ে༉))) } } DPDL3BNFO ͕ݺͼग़͞Εͨ࣌ͷ μϛʔͷΓΛઃఆ DPDL3BNFO ͷݺͼग़͠Ҿ͕ ҙਤͨ͠ͷ͔ݕূʢWFSJGZʣ
SwiftyMocky 50 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
WaiterTests: XCTestCase { func test_order() { // ४උ let mock = CockProtocolMock() mock.given(.cockRamen(bowls: .any, soup: .any, willReturn: [Ramen(soup: .ে༉), Ramen(soup: .ຯḩ)])) // ݺͼग़͠ let results = Waiter(cock: mock).order() // ݕূ XCTAssertEqual(results.count, 2) XCTAssertTrue(results.contains { $0.soup == .ে༉ }) XCTAssertTrue(results.contains { $0.soup == .ຯḩ }) mock.verify(.cockRamen(bowls: .value(2), soup: .value(.ে༉))) } } ิ͍͢͠ ิ͍͢͠
ϥΠϒίʔσΟϯά ʢ࣌ؒͳ͚Ε࠙ձͰʂʣ 51 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
·ͱΊ 52 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
·ͱΊ 53 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDL • ୯ମςετͳͲͰ͑ΔِͷΦϒδΣΫτ • ͯࣗ͢࡞͢Δͷίετ • 4XJGU • ಈతϥϯλΠϜΛར༻ͨ͠.PDL͍͠ • खಈPSίʔυੜʹͳΔ • 044 • ίʔυੜ͕ओྲྀʹͳΓͦ͏ʁʁ
&OKPZUFTUXJUI.PDL 54 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.