Pro Yearly is on sale from $80 to $50! »

Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud Firestore

473b12ebcfb79adfaef97796e94fc25c?s=47 Hiron
December 08, 2017

Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud Firestore

Mobile Act OSAKA #2で発表したスライドです。

473b12ebcfb79adfaef97796e94fc25c?s=128

Hiron

December 08, 2017
Tweet

Transcript

  1. Cloud Firestore を 作ってみた 2017/12/08 Mobile Act OSAKA #2 の、スタブ

  2. About Me • Twitter、GitHub、Qiita、
 SlideShare、Speaker Deck: ➡ hironytic • At

    work: ➡ iOS (Objective-C)、
 ときどき Android (Java)、
 Windows UWP(C#) • At home: ➡ iOS (Swift) ひろん
 (一宮 浩教)
  3. 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
  4. Cloud Firestore リアルタイムなデータ取得 サーバーとの通信も全部面倒見てくれる 使っている部分のテストどうしよう

  5. そうだ スタブ、作ろう

  6. スタブろう • スタブ (stub) とは、コンピュータプログラム のモジュールをテストする際、そのモジュール が呼び出す下位モジュールの代わりに用いる代 用品のこと。 引用元:Wikipedia 【スタブ】

  7. ドキュメント • JSONライクなKey-Value • Swiftでは [String: Any] { "name": "Nobita",

    "skill": "Hirune" }
  8. コレクション • ドキュメントを含むコン テナ • コレクション内でユニー クなドキュメントIDで管 理される { "name":

    "Nobita", "skill": "Hirune" } nvGvwR5 { "name": "Suneo", "skill": "Jiman" } zzD7UAv users
  9. サブコレクション { "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 ...
  10. データのリアルタイム取得 Firestore.firestore() .collection("users") .addSnapshotListener{ snapshot, error in // snapshot?.documents[0].documentID ...

    String // snapshot?.documents[0].data() ... [String: Any] } コレクション
  11. データのリアルタイム取得 Firestore.firestore() .collection("channels").document("CSP36ah") .collection("messages") .addSnapshotListener{ snapshot, error in // snapshot?.documents[0].documentID

    ... String // snapshot?.documents[0].data() ... [String: Any] } サブコレクション
  12. データのリアルタイム取得 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] } クエリ
  13. スタブりにくそう なので、 • すべての機能のスタブは作らない • 自分が必要なものだけ(なるべく妥協する) • Cloud Firestoreのインタフェースそのままでは やらない

  14. どうやってスタブるか? Firestore App

  15. DataStore どうやってスタブるか? Firestore App ある程度、操作を制限

  16. どうやってスタブるか? DefaultDataStore Firestore StubDataStore App 通常時 テスト時 DataStore

  17. コレクションの指定 protocol CollectionPath • コレクションを指す概念を抽象化 collection("channels") .document("CSP36ah") .collection("messages")

  18. クエリ protocol DataStoreQuery • クエリを指定する概念を抽象化 • CollectionPathもDataStoreQuery(プロトコルを継承) collection("channels") .whereField("age", isGreaterThan:

    "18") .order(by: "age") .order(by: "name")
  19. クエリ=フィルタ+ソート collection("channels") .whereField("age",
 isGreaterThan: "18") .order(by: "age") [Entity] .filter(...) .sorted(...)

    documentID: String data: [String: Any]
  20. リアルタイムなデータ取得 DataStoreQueryにマッチするEntityの配列が
 リアルタイムに流れてくる

  21. リアルタイムなデータ取得 DataStoreQueryにマッチするEntityの配列が
 リアルタイムに流れてくる RxSwiftのObservable func observeCollection(matches query: DataStoreQuery) -> Observable<[Entity]>

  22. スタブるぞ • CollectionPathごとに Observableを保持しておく StubDataStore /channels /channels/CSP36ah/messages Observable<[Entity]> Observable<[Entity]>

  23. /channels /channels/CSP36ah/messages Observable<[Entity]> Observable<[Entity]> スタブるぞ • DataStoreQueryに応じて、 フィルタ、ソートを行う Observableをmapで変換し て返す

    StubDataStore filter(...) sorted(...) Observable<[Entity]> func observeCollection(matches query: DataStoreQuery) -> Observable<[Entity]> map
  24. /channels /channels/CSP36ah/messages Observable<[Entity]> Observable<[Entity]> filter(...) sorted(...) Observable<[Entity]> map スタブるぞ •

    元のObservableに更新が 流れれば、さっき返した Observableにも自動的に (リアルタイムに)更新 が流れる StubDataStore ✨ ✨
  25. 更新系メソッドも まるっとやれば

  26. ほら、スタブれた ⭐ https://github.com/hironytic/CloudFirstoreStubPOC

  27. まとめ • Cloud Firestoreのスタブを作った(スタブった) • 必要な操作にしぼってスタブりやすくした • RxSwiftのおかげでリアルタイムなデータ取得の部 分がうまいこといった •

    作ったとは言ったが、使いものになるとは言って いない