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
HTTPモックライブラリ「Mockingjay」を使ってみた話/swift-mockingjay
Search
Yusuke Hosonuma
July 24, 2018
Programming
4.4k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HTTPモックライブラリ「Mockingjay」を使ってみた話/swift-mockingjay
iOS Test Night #8 での発表資料です。
https://testnight.connpass.com/event/90959/
Yusuke Hosonuma
July 24, 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
660
ソースコードから読み解く - Quick はどのように実装されているのか?/quick-code-reading
yusukehosonuma
7
11k
Swift 4.2 はどのような進化をしているのか/whats-new-swift42
yusukehosonuma
16
15k
SwiftにおけるMockライブラリの活用/swift-mock-library
yusukehosonuma
10
6.7k
Other Decks in Programming
See All in Programming
Java 27新機能 / Java 27 new features
kishida
2
150
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
1
150
すこし踏み込む CancellationToken
htkym
1
480
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
140
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
380
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
150
一人だけ、Kiroが静止する日
hideg
0
120
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
610
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
490
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
350
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
180
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
Become a Pro
speakerdeck
PRO
31
6.3k
Un-Boring Meetings
codingconduct
0
420
Mind Mapping
helmedeiros
1
360
The Mindset for Success: Future Career Progression
greggifford
PRO
0
500
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
How to make the Groovebox
asonas
2
2.4k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
540
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Transcript
Copyright (C) DeNA Co.,Ltd. All Rights Reserved. iOS Test Night
#8 2018/07/24 (Tue) ࡉপ ༞հ@DeNA )5514UVCϥΠϒϥϦ ʮ.PDLJOHKBZʯΛͬͯΈͨ 1
˙:VTVLF)PTPOVNBʢ!UPCJʣ • ॴଐ ⁃ %F/"ɹ48&5άϧʔϓɹςετج൫νʔϜ • 'BWPSJUF ⁃ •
ۙگ ⁃ ,VCFSOFUFT(,&ָ͕͍͠ʂ ⁃ J04%$ͰϨΪϡϥʔτʔΫʢʣʹ࠾ ࣗݾհ Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 2
ࠓɺ͢͜ͱ 3 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
)5514UVCϥΠϒϥϦ ʮ.PDLJOHKBZʯ ͷհɾͨ͠ͱ͜Ζ 4 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved.
ΞδΣϯμ 5 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
)5514UVCͱʁ • ࠓճͷར༻έʔε • .PDLJOHKBZͱʁ • ͨ͠ͱ͜Ζ • ·ͱΊ
)5514UVCͱʁ 6 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
HTTP Stub ͱʁ 7 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. • )551ϦΫΤετ௨৴ʹର͢Δ4UVCʢِʣ • ϦΫΤετʹରͯ͠ɺҙͷϨεϙϯεΛฦ͢ • ֎෦αʔόʹґଘ͠ͳ͍ςετ͕ॻ͚Δ
HTTP௨৴ 8 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ΞϓϦ
αʔό (&5BQJBSUJDMF 0,
HTTP௨৴ 9 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ΞϓϦ
αʔό (&5BQJBSUJDMF 0, ʲ՝ʳ Τϥʔ͕ฦ٫͞Εͨ߹ͷ ςετͲ͏Δʁ
HTTP௨৴ϨϕϧͷςετΛͲ͏͢Δʁ 10 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
Βͳ͍ • ௨৴༻.PEFMΫϥεͷ4UVCͰΧόʔ • &&ςετͰΧόʔ • Δ • αʔόଆͷઃఆΛҰ࣌తʹมߋ • )5514UVC
HTTP௨৴ϨϕϧͷςετΛͲ͏͢Δʁ 11 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
Βͳ͍ • ௨৴༻.PEFMΫϥεͷ4UVCͰΧόʔ • &&ςετͰΧόʔ • Δ • αʔόଆͷઃఆΛҰ࣌తʹมߋ • )5514UVC ࠓճͷબ
HTTP Stub 12 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ΞϓϦ αʔό (&5BQJBSUJDMF /05@'06/% )5514UVC αʔόͱͷؒʹೖͬͯɺ ҙͷϨεϙϯεΛฦ͢ʂ
ࠓճͷར༻έʔε 13 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ࠓճͷར༻έʔε 14 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Client
αʔό 4XJGU1. αʔόͱԿ௨৴͢Δ ઃఆʹج͍ͮͯ$-*Λ࣮ߦͯ͠ɺ ҙਤͨ͠௨৴͕ߦΘΕΔ͔Λݕূ͍ͨ͠ʜ $-*πʔϧ
)5514UVC ࠓճͷར༻έʔε 15 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Client αʔό 4XJGU1. )5514UVCϥΠϒϥϦΛͬͯɺ ΠϯςάϨʔγϣϯʢ݁߹ʣςετ .PDLJOHKBZΛͬͯΈͨ
.PDLJOHKBZͱʁ 16 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mockingjayͱʁ 17 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
)5514UVCϥΠϒϥϦ • 4XJGU • ϦΫΤετఆٛʢ.BUDIFSʣ • Ϩεϙϯεੜʢ#VJMEFSʣ • 63-4FTTJPO • $POpHVSBUJPOΛࠩ͠ସ͑ • 63-4FTTJPOҎ֎ͷ௨৴ʹར༻Ͱ͖ͳ͍ IUUQTHJUIVCDPNLZMFG.PDLJOHKBZ .FUIPE4XJ[[MJOH
ModelΫϥε 18 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
url = "http://example.com/api" struct ProposalRepository { func all(_ handler: @escaping ([ProposalElement]) -> Void) { Alamofire.request(url).responseProposal { response in if let proposals = response.result.value { handler(proposals) } } } }
ModelΫϥε 19 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
url = "http://example.com/api" struct ProposalRepository { func all(_ handler: @escaping ([ProposalElement]) -> Void) { Alamofire.request(url).responseProposal { response in if let proposals = response.result.value { handler(proposals) } } } } BQJ
ModelΫϥε 20 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
url = "http://example.com/api" struct ProposalRepository { func all(_ handler: @escaping ([ProposalElement]) -> Void) { Alamofire.request(url).responseProposal { response in if let proposals = response.result.value { handler(proposals) } } } } "MBNPpSF
ModelΫϥε 21 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
url = "http://example.com/api" struct ProposalRepository { func all(_ handler: @escaping ([ProposalElement]) -> Void) { Alamofire.request(url).responseProposal { response in if let proposals = response.result.value { handler(proposals) } } } } $BMMCBDL
ModelΫϥε 22 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
url = "http://example.com/api" struct ProposalRepository { func all(_ handler: @escaping ([ProposalElement]) -> Void) { Alamofire.request(url).responseProposal { response in if let proposals = response.result.value { handler(proposals) } } } } $BMMCBDL ͪͳΈʹRVJDLUZQFJPͰίʔυੜ
GET /api ʹରͯ͠ɺJSONΛฦ͢ 23 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. let data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊", ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊", ], ] stub(http(.get, uri: "/api"), json(data))
GET /api ʹରͯ͠ɺJSONΛฦ͢ 24 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. let data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊", ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊", ], ] stub(http(.get, uri: "/api"), json(data)) Ϩεϙϯεσʔλ
GET /api ʹରͯ͠ɺJSONΛฦ͢ 25 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. let data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊", ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊", ], ] stub(http(.get, uri: "/api"), json(data)) ॲཧ͢ΔύεΛఆٛ
GET /api ʹରͯ͠ɺJSONΛฦ͢ 26 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. let data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊", ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊", ], ] stub(http(.get, uri: "/api"), json(data)) Ϩεϙϯεఆٛ
࣮ࡍͷςετίʔυ 27 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊" ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊" ], ] stub(http(.get, uri: "/api"), json(data)) let exp = expectation(description: "") repository.all { proposals in XCTAssertEqual(2, proposals.count) XCTAssertEqual("λΠτϧ1", proposals.first?.title) XCTAssertEqual("Ϣʔβ໊", proposals.first?.user) exp.fulfill() } wait(for: [exp], timeout: 3)
࣮ࡍͷςετίʔυ 28 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊" ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊" ], ] stub(http(.get, uri: "/api"), json(data)) let exp = expectation(description: "") repository.all { proposals in XCTAssertEqual(2, proposals.count) XCTAssertEqual("λΠτϧ1", proposals.first?.title) XCTAssertEqual("Ϣʔβ໊", proposals.first?.user) exp.fulfill() } wait(for: [exp], timeout: 3) )5514UVCઃఆ
࣮ࡍͷςετίʔυ 29 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊" ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊" ], ] stub(http(.get, uri: "/api"), json(data)) let exp = expectation(description: "") repository.all { proposals in XCTAssertEqual(2, proposals.count) XCTAssertEqual("λΠτϧ1", proposals.first?.title) XCTAssertEqual("Ϣʔβ໊", proposals.first?.user) exp.fulfill() } wait(for: [exp], timeout: 3) .PEFMͷςετ
࣮ࡍͷςετίʔυ 30 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. let
data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊" ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊" ], ] stub(http(.get, uri: "/api"), json(data)) let exp = expectation(description: "") repository.all { proposals in XCTAssertEqual(2, proposals.count) XCTAssertEqual("λΠτϧ1", proposals.first?.title) XCTAssertEqual("Ϣʔβ໊", proposals.first?.user) exp.fulfill() } wait(for: [exp], timeout: 3) ඇಉظॲཧΛͭ
ͨ͠ͱ͜Ζ 31 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ᶃγϯλοΫεϊΠζ 32 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mockingjay API 33 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
stub(http(.get, uri: "/api")) { request in let data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊" ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊" ], ] return jsonBody(data)(request) }
Mockingjay API 34 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
stub(http(.get, uri: "/api")) { request in let data: [[String: String]] = [ [ "title": "λΠτϧ1", "user": "Ϣʔβ໊" ], [ "title": "λΠτϧ2", "user": "Ϣʔβ໊" ], ] return jsonBody(data)(request) } ͕ଟͯ͘গ͠ಡΈͮΒ͍ʜ • ϊΠζײ͕͋Δ • .BUDIFS"1*ίʔυิͮ͠Β͍
ϥούʔAPI Λॻ͍ͯΈΔ 35 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
func stubHttp(_ method: HTTPMethod, _ path: String, _ builder: @escaping Builder) { stub(http(method, uri: path)) { request in builder(request) } } ຊʹϥοϓ͚ͨͩ͠
Before / After 36 Copyright (C) DeNA Co.,Ltd. All Rights
Reserved. // // Before: // stub(http(.get, uri: "/api") { } // // After // stubHttp(.get, "/api") { } • ࢹೝੑ͕Α͘ͳͬͨʂ • ֮͑Δ͜ͱগͳ͘ɺิ͍͢͠ʂ
ᶄ4UVC͕ ݺͼग़͞Εͨ͜ͱΛอূ 37 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ૺ۰ͨ͠ࣄ 38 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
TUVCΛઃఆ ςετΛॻ͘ ޭͯ͠ظͲ͓Γಈ͍ͯΔͱࢥͬͨ ࣮ࡍʹ63-ͷύε͕ҟͳ͓ͬͯΓ ݺΕ͍ͯͳ͔ͬͨPS[ ͜͏͍ͬͨϛεΛແ͍ͨ͘͠ɾɾɾ
Stub ݺͼग़͠Λอূ͢Δ 39 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
let exp = expectation(description: “/api") stubHttp(.get, "/api") { request in exp.fulfill() let data: [[String: String]] = [] return jsonBody(data)(request) } wait(for: [exp], timeout: 3)
Stub ݺͼग़͠Λอূ͢Δ 40 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
let exp = expectation(description: “/api") stubHttp(.get, "/api") { request in exp.fulfill() let data: [[String: String]] = [] return jsonBody(data)(request) } wait(for: [exp], timeout: 3) 9$5FTU&YQFDUBUJPOΛੜ
Stub ݺͼग़͠Λอূ͢Δ 41 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
let exp = expectation(description: “/api") stubHttp(.get, "/api") { request in exp.fulfill() let data: [[String: String]] = [] return jsonBody(data)(request) } wait(for: [exp], timeout: 3) 4UVC͕ݺͼग़͞ΕͨΒGVMMpMM
Stub ݺͼग़͠Λอূ͢Δ 42 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
let exp = expectation(description: “/api") stubHttp(.get, "/api") { request in exp.fulfill() let data: [[String: String]] = [] return jsonBody(data)(request) } wait(for: [exp], timeout: 3) GVMMpMM͞Εͯͳ͚Ε λΠϜΞτͰࣦഊ
Stub ݺͼग़͠Λอূ͢Δ 43 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
let exp = expectation(description: “/api") stubHttp(.get, "/api") { request in exp.fulfill() let data: [[String: String]] = [] return jsonBody(data)(request) } wait(for: [exp], timeout: 3) • TUVC͕ݺͼग़͞Εͳ͍߹Τϥʔʹʂ • Ͱɺͳίʔυ͕ଟ͍ʁˠ͜Ε࣍Ͱʂ
ᶅ%4-ͷඋ 44 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ݱঢ়ͷ՝ 45 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
TUVC͕ݺͼग़͞ΕΔ͜ͱΛอূͰ͖ͨ • ຖճ͜ΕΛॻ͘ͷ໘ • ຊ࣭తͰͳ͍ίʔυ͕ଟ͘ͳΔ
ݱঢ়ͷ՝ 46 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
TUVC͕ݺͼग़͞ΕΔ͜ͱΛอূͰ͖ͨ • ຖճ͜ΕΛॻ͘ͷ໘ • ຊ࣭తͰͳ͍ίʔυ͕ଟ͘ͳΔ ͬͱָΛ͍ͨ͠ʂ
࠷ऴతͳίʔυ 47 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. expectCall(
stubHttp(.get, “/api/v1“) { request in ... } ) expectCall( stubHttp(.get, “/api/v2“) { request in ... } ) waitCallExpectation()
stubHttp ϝιουͷ֦ு 48 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
func stubHttp(_ method: HTTPMethod, _ path: String, _ builder: @escaping Builder) -> XCTestExpectation { let exp = expectation(description: "request \(method): \(path)") stub(http(method, uri: path)) { request in exp.fulfill() return builder(request) } return exp }
stubHttp ϝιουͷ֦ு 49 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
func stubHttp(_ method: HTTPMethod, _ path: String, _ builder: @escaping Builder) -> XCTestExpectation { let exp = expectation(description: "request \(method): \(path)") stub(http(method, uri: path)) { request in exp.fulfill() return builder(request) } return exp } ෦Ͱ&YQFDUBUJPOΛੜ
stubHttp ϝιουͷ֦ு 50 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
func stubHttp(_ method: HTTPMethod, _ path: String, _ builder: @escaping Builder) -> XCTestExpectation { let exp = expectation(description: "request \(method): \(path)") stub(http(method, uri: path)) { request in exp.fulfill() return builder(request) } return exp } TUVC͕ݺͼग़͞ΕͨΒGVMMpMM
stubHttp ϝιουͷ֦ு 51 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
func stubHttp(_ method: HTTPMethod, _ path: String, _ builder: @escaping Builder) -> XCTestExpectation { let exp = expectation(description: "request \(method): \(path)") stub(http(method, uri: path)) { request in exp.fulfill() return builder(request) } return exp } &YQFDUBUJPOΛSFUVSOͰฦ͢
ͷςετΫϥεΛ࡞ 52 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } }
ͷςετΫϥεΛ࡞ 53 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } 9$5FTU&YQFDUBUJPOͷྻΛ༻ҙ
ͷςετΫϥεΛ࡞ 54 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } Ҿʹ͞Εͨ&YQFDUBUJPOΛՃ
ͷςετΫϥεΛ࡞ 55 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } Ճ͞Εͨ&YQFDUBUJPOΛXBJU
શମ 56 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } // ςετίʔυ expectCall( stubHttp(.get, “/api/v1“) { request in ... } ) waitCallExpectation()
શମ 57 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } // ςετίʔυ expectCall( stubHttp(.get, “/api/v1“) { request in ... } ) waitCallExpectation() ฦ٫͞Εͨ&YQFDUBUJPO͕ҾʹΔ
શମ 58 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } // ςετίʔυ expectCall( stubHttp(.get, “/api/v1“) { request in ... } ) waitCallExpectation() Ճ͞Εͨ&YQFDUBUJPOΛXBJU
શମ 59 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class
HttpTestCase: XCTestCase { private var stubHttpCallExpectations: [XCTestExpectation]! } extension HttpTestCase { func expectCall(_ exp: XCTestExpectation) { stubHttpCallExpectations.append(exp) } func waitCallExpectation() { wait(for: stubHttpCallExpectations, timeout: 3) } } // ςετίʔυ expectCall( stubHttp(.get, “/api/v1“) { request in ... } ) waitCallExpectation()
·ͱΊ 60 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
·ͱΊ 61 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDLJOHKBZ4XJGUͷ)5514UVCϥΠϒϥϦ • )551௨৴ͷςετʹ͑Δ • "1*ϥούʔΛॻ͍ͯྑ͔ͬͨ • ίʔυ͕গͳ͘ɺҙਤ͕໌֬ʹ • ίʔυิշద
·ͱΊ 62 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. •
.PDLJOHKBZ4XJGUͷ)5514UVCϥΠϒϥϦ • )551௨৴ͷςετʹ͑Δ • "1*ϥούʔΛॻ͍ͯྑ͔ͬͨ • ίʔυ͕গͳ͘ɺҙਤ͕໌֬ʹ • ίʔυิշద )5514UVC ͓֮͑ͯ͘ͱثͱཱ͔ͯͭ͠ʂʁ
એ 63 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
iOSDC ͷ CfP ҰཡΛݟΕΔαʔϏεΛ ϓϥΠϕʔτͰ࡞Γ·ͨ͠ʂ 64 Copyright (C) DeNA Co.,Ltd.
All Rights Reserved. h(p://iosdc-cfps.penginmura.tech/ ࠓޙػೳՃΛ༧ఆ
%F/"͔Β ໊͕ొஃ͠·͢ʂ 65 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ϒʔεΓ·͢ʂ
&OKPZEFWFMPQNFOU XJUI)551TUVCT 66 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.