Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud F...
Search
Hiron
December 08, 2017
Technology
1
880
Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud Firestore
Mobile Act OSAKA #2で発表したスライドです。
Hiron
December 08, 2017
Tweet
Share
More Decks by Hiron
See All by Hiron
カンファレンス動画鑑賞会のススメ / Osaka.swift #1
hironytic
0
350
try! Swift Tokyo 2024 参加報告 / try! Swift Tokyo 2024 Report
hironytic
0
540
Swift on Windows ファーストインプレッション / Swift on Windows First Impression
hironytic
0
700
iPadOSDC: Multiple Windows
hironytic
5
3.5k
だったら、俺が代わりにやってやる / Swift Zoomin' Challenge
hironytic
0
240
SwiftのNeverとボトム型 / Never as a Bottom Type
hironytic
2
920
4000のワーニングと戦え!これは警告だ! / 4000 Warnings
hironytic
2
890
シンボリケート / Ore-con 2018 Summer
hironytic
3
1.2k
全部iOSにしゃべらせちゃえ! / iOSDC 2018 LT
hironytic
3
2k
Other Decks in Technology
See All in Technology
ナレッジワークのご紹介(第88回情報処理学会 )
kworkdev
PRO
0
170
Yahoo!ショッピングのレコメンデーション・システムにおけるML実践の一例
lycorptech_jp
PRO
1
190
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
0
860
[AEON TECH HUB #24] お客様の長期的興味の理解に向けて
alpicola
0
140
Claude Codeが爆速進化してプラグイン追従がつらいので半自動化した話 ver.2
rfdnxbro
0
490
技術的負債の泥沼から組織を救う3つの転換点
nwiizo
8
3.5k
PMBOK第8版は第7版から何が変わったのか(PMBOK第8版概要解説) / 20260304 Takeshi Watarai
shift_evolve
PRO
0
200
EMからICへ、二周目人材としてAI全振りのプロダクト開発で見つけた武器
yug1224
5
520
自動テストが巻き起こした開発プロセス・チームの変化 / Impact of Automated Testing on Development Cycles and Team Dynamics
codmoninc
3
1.3k
マルチプレーンGPUネットワークを実現するシャッフルアーキテクチャの整理と考察
markunet
2
230
参考スライド:AI_Driven_Engineering_Redefined
creationline
0
100
事例に見るスマートファクトリーへの道筋〜工場データをAI Readyにする実践ステップ〜
hamadakoji
1
280
Featured
See All Featured
Faster Mobile Websites
deanohume
310
31k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
210
Skip the Path - Find Your Career Trail
mkilby
1
75
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
980
Building Flexible Design Systems
yeseniaperezcruz
330
40k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
51k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.4k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
110
Art, The Web, and Tiny UX
lynnandtonic
304
21k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
240
The SEO identity crisis: Don't let AI make you average
varn
0
410
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のおかげでリアルタイムなデータ取得の部 分がうまいこといった •
作ったとは言ったが、使いものになるとは言って いない