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
Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud F...
Search
Hiron
December 08, 2017
Technology
920
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud Firestore
Mobile Act OSAKA #2で発表したスライドです。
Hiron
December 08, 2017
More Decks by Hiron
See All by Hiron
カンファレンス動画鑑賞会のススメ / Osaka.swift #1
hironytic
0
410
try! Swift Tokyo 2024 参加報告 / try! Swift Tokyo 2024 Report
hironytic
0
590
Swift on Windows ファーストインプレッション / Swift on Windows First Impression
hironytic
0
750
iPadOSDC: Multiple Windows
hironytic
5
3.8k
だったら、俺が代わりにやってやる / Swift Zoomin' Challenge
hironytic
0
270
SwiftのNeverとボトム型 / Never as a Bottom Type
hironytic
2
960
4000のワーニングと戦え!これは警告だ! / 4000 Warnings
hironytic
2
930
シンボリケート / Ore-con 2018 Summer
hironytic
3
1.3k
全部iOSにしゃべらせちゃえ! / iOSDC 2018 LT
hironytic
3
2.1k
Other Decks in Technology
See All in Technology
その Valkey 使いこなしていますか?
onk
PRO
5
1.7k
hackers_champloo_2026_tidb
makocchi
0
170
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
200
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
210
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
300
AIカンパニーへの転換を支えた、エンジニアの仕事の再定義
kworkdev
PRO
2
1.4k
導入から定着へ ~コーディングエージェントを日常業務に組み込む実践知~
yukisakai1225
0
120
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
280
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
1k
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
200
サブエージェントと Claude Mods で作る独自 Advisor ツールの話
kenichiodo
2
180
会社説明資料
persolserverworks
0
9.8k
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
2
5.4M
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
A Soul's Torment
seathinner
8
3.8k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
600
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
Cloud Firestore を 作ってみた 2017/12/08 Mobile Act OSAKA #2 の、スタブ
About Me • Twitter、GitHub、Qiita、 SlideShare、Speaker Deck: ➡ hironytic • At
work: ➡ iOS (Objective-C)、 ときどき Android (Java)、 Windows UWP(C#) • At home: ➡ iOS (Swift) ひろん (一宮 浩教)
Firebase •Remote Config •App Indexing •Dynamic Links •Invites •AdWords •AdMob
•Analytics Develop Grow Earn •Cloud Messaging •Authentication •Realtime Database •Cloud Firestore (beta) •Storage •Hosting •Test Lab •Crash Reporting Oct.4, 2017 Mobile Act OSAKA #1
Cloud Firestore リアルタイムなデータ取得 サーバーとの通信も全部面倒見てくれる 使っている部分のテストどうしよう
そうだ スタブ、作ろう
スタブろう • スタブ (stub) とは、コンピュータプログラム のモジュールをテストする際、そのモジュール が呼び出す下位モジュールの代わりに用いる代 用品のこと。 引用元:Wikipedia 【スタブ】
ドキュメント • JSONライクなKey-Value • Swiftでは [String: Any] { "name": "Nobita",
"skill": "Hirune" }
コレクション • ドキュメントを含むコン テナ • コレクション内でユニー クなドキュメントIDで管 理される { "name":
"Nobita", "skill": "Hirune" } nvGvwR5 { "name": "Suneo", "skill": "Jiman" } zzD7UAv users
サブコレクション { "name": "general" } CSP36ah { "name": "random" }
CSP4CQz channels messages { "from": "AAd7UZv", "message": "何してますか?忙しいですか..." } MV5ahcO { "from": "nvGvwR5", "message": "昼寝してた" } MV5yaC0 { "from": "AAd7UZv", "message": "近くのコンビニエンスストアで..." } MV6Almn { "from": "nvGvwR5", "message": "まかせといてよ" } MV6L38V messages ...
データのリアルタイム取得 Firestore.firestore() .collection("users") .addSnapshotListener{ snapshot, error in // snapshot?.documents[0].documentID ...
String // snapshot?.documents[0].data() ... [String: Any] } コレクション
データのリアルタイム取得 Firestore.firestore() .collection("channels").document("CSP36ah") .collection("messages") .addSnapshotListener{ snapshot, error in // snapshot?.documents[0].documentID
... String // snapshot?.documents[0].data() ... [String: Any] } サブコレクション
データのリアルタイム取得 Firestore.firestore() .collection("users") .whereField("age", isGreaterThan: "18") .order(by: "age") .order(by: "name")
.addSnapshotListener{ snapshot, error in // snapshot?.documents[0].documentID ... String // snapshot?.documents[0].data() ... [String: Any] } クエリ
スタブりにくそう なので、 • すべての機能のスタブは作らない • 自分が必要なものだけ(なるべく妥協する) • Cloud Firestoreのインタフェースそのままでは やらない
どうやってスタブるか? Firestore App
DataStore どうやってスタブるか? Firestore App ある程度、操作を制限
どうやってスタブるか? DefaultDataStore Firestore StubDataStore App 通常時 テスト時 DataStore
コレクションの指定 protocol CollectionPath • コレクションを指す概念を抽象化 collection("channels") .document("CSP36ah") .collection("messages")
クエリ protocol DataStoreQuery • クエリを指定する概念を抽象化 • CollectionPathもDataStoreQuery(プロトコルを継承) collection("channels") .whereField("age", isGreaterThan:
"18") .order(by: "age") .order(by: "name")
クエリ=フィルタ+ソート collection("channels") .whereField("age", isGreaterThan: "18") .order(by: "age") [Entity] .filter(...) .sorted(...)
documentID: String data: [String: Any]
リアルタイムなデータ取得 DataStoreQueryにマッチするEntityの配列が リアルタイムに流れてくる
リアルタイムなデータ取得 DataStoreQueryにマッチするEntityの配列が リアルタイムに流れてくる RxSwiftのObservable func observeCollection(matches query: DataStoreQuery) -> Observable<[Entity]>
スタブるぞ • CollectionPathごとに Observableを保持しておく StubDataStore /channels /channels/CSP36ah/messages Observable<[Entity]> Observable<[Entity]>
/channels /channels/CSP36ah/messages Observable<[Entity]> Observable<[Entity]> スタブるぞ • DataStoreQueryに応じて、 フィルタ、ソートを行う Observableをmapで変換し て返す
StubDataStore filter(...) sorted(...) Observable<[Entity]> func observeCollection(matches query: DataStoreQuery) -> Observable<[Entity]> map
/channels /channels/CSP36ah/messages Observable<[Entity]> Observable<[Entity]> filter(...) sorted(...) Observable<[Entity]> map スタブるぞ •
元のObservableに更新が 流れれば、さっき返した Observableにも自動的に (リアルタイムに)更新 が流れる StubDataStore ✨ ✨
更新系メソッドも まるっとやれば
ほら、スタブれた ⭐ https://github.com/hironytic/CloudFirstoreStubPOC
まとめ • Cloud Firestoreのスタブを作った(スタブった) • 必要な操作にしぼってスタブりやすくした • RxSwiftのおかげでリアルタイムなデータ取得の部 分がうまいこといった •
作ったとは言ったが、使いものになるとは言って いない