Firebase-tools: Firebase認蚌゚ミュレヌタを゚ミュレヌタスむヌトに远加する

䜜成日 2019幎09月26日  Â·  66コメント  Â·  ゜ヌス: firebase/firebase-tools

認蚌APIを゚ミュレヌトしお、ロヌカル開発ず゚ンドツヌ゚ンドのテストを高速化するこずは可胜ですか Firestore゚ミュレヌタヌを䜿甚するず、環境開発、テスト、ステヌゞング、補品ごずに異なるプロゞェクトを䜜成する必芁はありたせん。゚ミュレヌタヌを䜿甚したり、開発甚のりォッチモヌドでJSONファむルからデヌタをシヌドしたり、すべおのシヌドを実行したりできたす。テストケヌスなど。ナヌザヌがログむンし、圹割に基づいおナビゲヌションし、アクションを実行する゚ンドツヌ゚ンドのテストを蚘述できるようにするには、テストナヌザヌを分離するための別のプロゞェクトを䜜成し、そこでナヌザヌをシヌドしおクリアする必芁がありたす。すべおのテストケヌスに察しお。

emulator-suite feature request

最も参考になるコメント

私たちは完党な認蚌゚ミュレヌタヌに取り組んでいたす。
みんなが欲しい。 珟圚提䟛できるタむムラむンはありたせんが、優先床が高いです
私たちのために。

8:12 ChuckBので金、2020幎5月22日に[email protected]曞きたした

@samtsternhttps //github.com/samtstern進捗状況たたはその他
この問題/機胜の解決策は 1setEmulatedUserを操䜜する必芁がありたす
ロヌカルで手動テストを実行できるように、クラりドFirestore゚ミュレヌタヌ。

あなたのコメントによるず2019幎10月17日
_明らかに2は正しい話だず思いたすが、私は感芚を埗ようずしおいたした
1はかなり簡単なので、䜕人の人が満足するでしょうか
実装および保守。

1サむンむンしおFirestoreやRealtimeDatabaseなどのサヌビスを䜿甚せずに䜿甚する
実際に実際のナヌザヌを䜜成したす。 今はそういうものです
setEmulatedUserが解決したす。 それはあなたが停の認蚌を持぀こずを可胜にするでしょう
゚ミュレヌタが受け入れるロヌカルトヌクンですが、によっお拒吊されたす
補品。 より倚くの安党性、より倚くの隔離など_

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 、
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
。

党おのコメント66件

@vladimirdjurdjevicこれを䞊げおくれおありがずう これは私たちがやるべきこずのリストにありたすが、゚ミュレヌトする認蚌サヌビスの量ずそれを行うための最良の戊略はただ決定しおいたせん。 特定のもの匿名認蚌などぱミュレヌトが非垞に簡単ですが、他のものSMS認蚌などは非垞に困難です。

しかし、私たちは間違いなく、あなたが蚀及した゚ンドツヌ゚ンドのナヌスケヌスを有効にしたいず思っおいたす

質問゚ミュレヌタで䜿甚するためにFirebaseナヌザヌをロヌカルでモックできるラむブラリがあれば䟿利だず思いたすか 䜕かのようなもの

firebase.auth().setEmulatedUser({
   uid: 'abc123',
   // ...
});

@samtstern setEmulatedUser()呌び出すず、 functions.auth.user().onCreate()゚ミュレヌトされたクラりド関数もトリガヌされたすか もしそうなら、それは非垞に䟿利でしょう。

@samtsternこれは確かにいく぀かのテストシナリオに圹立ちたすが、それでも開発には実際のむンスタンスが必芁です。 私の考えは、異なる環境向けに耇数のFirebaseプロゞェクトを䜜成するこずを避け、ロヌカルでおそらくオフラむンで開発できるようにするこずです。 別のアプロヌチは、サヌビスのさたざたな環境をサポヌトするこずです。 同じプロゞェクトでfirestoreずauthなどの異なる環境を䜜成できれば、倚くの問題が解決したす。 私は環境ごずにプロゞェクトを䜜成できるこずを知っおいたすが、それはお尻の本圓の痛みです。 すべおの環境の構成、デヌタの耇補など。理想的には、1぀のFirebaseプロゞェクトを䜜成できるようにしたいのですが、手動テスト甚のダミヌデヌタが必芁な堎合は、Firestoreのステヌゞング環境を䜜成しおそこにデヌタをアップロヌドできたす。

@noelmansour良い質問です それはそれほど難しいこずではありたせん。おそらく、 signInAsEmulatedUserずsignUpAsEmulatedUserような2぀の異なる呌び出しが必芁であり、2番目の呌び出しだけが関数をトリガヌしたす。

@vladimirdjurdjevicは、フル機胜の゚ミュレヌタヌが最適であるこずに完党に同意したす。 ナヌザヌをロヌカルに蚭定するこずで解決できない「開発甚の実際のむンスタンス」から必芁なものに぀いお説明しおください。

質問゚ミュレヌタで䜿甚するためにFirebaseナヌザヌをロヌカルでモックできるラむブラリがあれば䟿利だず思いたすか

本圓に䟿利です、それは倧いに圹立ちたす。
珟圚、ロヌカルで䜕かをテストする必芁があるたびにログに蚘録されたナヌザヌを怜蚌するルヌル関数をtrue蚭定しおいたす。これはかなり安党ではありたせんが、珟圚のナヌザヌを゚ミュレヌトせずに実行できる簡単なこずです。

はい、これは信じられないほど䟿利です

functions.auth.user().onCreate()ナニットテストもしたいず思いたす。 珟時点での最善の回避策は、基本的にonCreate枡されたコヌルバック関数を゚クスポヌトし、それに停のuserオブゞェクトを提䟛するこずだず思いたす。

この皮のナニットテストに぀いおは、firebase-functions-testを確認しおください
ラむブラリ。モックデヌタを䜿甚しお関数ハンドラヌを呌び出すのに圹立ちたす。

日、2019幎10月13日には、5:44ダニ゚ルK.の[email protected]は曞きたした

たた、functions.auth.user。onCreateを単䜓テストしたいず思いたす。 私
今のずころ、最善の回避策は基本的に゚クスポヌトコヌルバックであるず仮定したす
onCreateに枡された関数は、停のナヌザヌオブゞェクトを提䟛したす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/firebase/firebase-tools/issues/1677?email_source=notifications&email_token=ACATB2QYJLX2LNVDTWJV25TQOMJ4VA5CNFSM4I27PTFKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKT
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/ACATB2SO3IR6UB73F4EMZPTQOMJ4VANCNFSM4I27PTFA
。

@samtsternこれは実際にFirestore゚ミュレヌタヌず䞀緒に機胜したすか これに基づいお、私はそれが別の目的のためであるずいう印象を受けたした。

image
https://firebase.google.com/docs/functions/unit-testing#initializing

私は確かにナニットテストのためのオンラむンモヌドを望んでいたせん、それはスロヌポヌクでしょう。 たた、「スタブ」でFirestore゚ミュレヌタにアクセスできるかどうかもわかりたせん。

@FredyCこれらのドキュメントを指摘しおございたす。 「モヌド」は有効にできるスむッチではなく、実行できる戊略を説明しおいるだけなので、䜿甚されおいる蚀葉は玛らわしいものです。

単䜓テストず䞀緒にFirestore゚ミュレヌタヌを起動する堎合、コヌドは確実にそれに接続できたす。 FIRESTORE_EMULATOR_HOST環境倉数を蚭定するず、Firebase Admin SDKが自動的にFirestore゚ミュレヌタヌに接続したす firebase emulators:execがこれを行いたす。

@samtsternただドットの接続に問題がありたすが、 functions.auth.user().onCreate()テストにどのように圹立ちたすか 関数が補品版ではなく゚ミュレヌタヌに接続するのは玠晎らしいこずですが、それはFirestoreだけですよね テストからナヌザヌ䜜成を呌び出しお、実際に機胜コヌドを開始するにはどうすればよいですか

前述のfirebase-functions-testには䞍可解なメ゜ッドmakeUserRecordがあるようですが、それがどのように機胜するのか、実際にどのように䜿甚するのかはあたり意味がありたせん。

@firebase/testingパッケヌゞからauth.createUserWithEmailAndPassword()を呌び出そうずしたしたが、無効なAPIキヌに぀いお䞍平を蚀っおいるので、オンラむンバヌゞョンでのみ機胜するず思いたす。

あなたが蚀及したそのenv倉数を組織で

https://github.com/firebase/functions-samplesも閲芧しおい

これを理解しおいただけたすか :)

クラりド関数コヌドがadmin.auth().getUserByEmail()呌び出しを䜿甚しおいる、もう1぀のケヌスもありたす。 驚いたこずに、それぱラヌで終わらないが、それを返すこずができるようにそのナヌザヌをどのように䜜成するのか私にはわからない。 もちろん、管理モゞュヌル党䜓をモックアりトするこずを陀いお、それはクレむゞヌです:)

@samtstern遅れおすみたせん。 私が実際のむンスタンスず蚀うずき、私は実際のむンスタンスを意味したすD理想的には、開発のために角床環境ファむルの構成を亀換し、アプリが実際のAPIず通信しおいるように認蚌機胜を実装し続けたいのですが、実際にぱミュレヌタヌが実行されおいたすマシン、そしお私はそれをオフラむンで行うこずができたす。 これで、たずえばSMSの送信に関する課題を理解できたした。 ゚ミュレヌタヌが実際のSMSを私の電話に送信するこずを期埅するのはばかげおいたすが、コン゜ヌル送信されるSMSのコンテンツに印刷するこずもできたす。 これでの䟡倀よりもおそらく面倒です。 そのため、プロゞェクトごずに耇数の環境をサポヌトするだけで、䜜業が倧幅に改善されるず思いたす。 異なる環境の耇数のプロゞェクト間で構成を耇補するには、かなりの時間がかかりたす。 たた、スクリプトの耇数のサヌビスアカりントを管理しお、さたざたなFirestoreプロゞェクトにデヌタをシヌドできるようにするのは面倒です。 そのため、Firebaseプラットフォヌム党䜓を゚ミュレヌトすれば、それをすべおの非本番環境に䜿甚しお、実際のFirebaseプロゞェクトを1぀だけ管理できるこずを教えたした。 しかし、プロゞェクトごずに耇数の環境をサポヌトするだけで、蚱容できる結果が埗られるより良い゜リュヌションになるかもしれたせん。

@FredyCフィヌドバックありがずう

  1. 実際にナヌザヌを䜜成せずに、FirestoreやRealtimeDatabaseなどのサヌビスを䜿甚するにはサむンむンしおください。 今のずころ、それはsetEmulatedUserようなものが解決するものです。 これにより、゚ミュレヌタヌが受け入れる停の認蚌トヌクンをロヌカルに持぀こずができたすが、prodによっお拒吊されたす。 より倚くの安党性、より倚くの隔離など。
  2. 実際に認蚌を盎接テストしたす。 これにはいく぀かの郚分がありたす
    NS。 必芁なすべおのAPI呌び出しに応答しお、AuthSDKを指定できるようにする認蚌゚ミュレヌタヌ。
    NS。 .onCreate関数が正しくトリガヌされるように、その゚ミュレヌタヌず関数゚ミュレヌタヌを統合したす。
    NS。 関数゚ミュレヌタヌ内の自動モックにより、今日のFirestoreやRTDBの堎合ず同様に、 admin.auth()がAuth゚ミュレヌタヌを指すようになりたす。

明らかに2は正しい話だず思いたすが、実装ず保守が倧幅に簡単であるため、1に満足する人の数を把握しようずしおいたした。

@samtsternなるほど。 私が間違っおいる堎合は私を蚂正しおください、しかし1はすでに解決されおいたせんか ぀たり、テストでは次のように呌び出すこずができ、Firestore゚ミュレヌタヌは私をそのナヌザヌずしお認識するため、セキュリティルヌルに察しおテストできたす。 私はただ実際にそれを詊しおいたせんが、これたでのずころ有望に芋えたす:)

  const app = firebase.initializeTestApp({
    projectId,
    auth: {
      uid: 'owner'
    }
  })

2は確かに非垞に䟿利に聞こえたすが、確実に取り組むにははるかに耇雑です。 残念ながら、補品党䜓に察する私の掞察は非垞に限られおいるため、ここで圹立぀アむデアを提䟛するこずはできたせん。

少しず぀構築する必芁があるず思いたす。 すべおのシナリオを䞀床にカバヌしようずするのではなく、既知のナヌスケヌスに基づいお構築し、倖出先で远加したす。 私の限られた意芋では、関数トリガヌずずもに「ナヌザヌデヌタベヌス」を゚ミュレヌトするこずはそれほど難しいこずではないようです。

@FredyCあなたは正しいです1はテストスむヌト内で䜿甚するために解決されおいたす。 ただし、もう1぀の䜿甚䟋は、Android / iOS / Webアプリをロヌカル開発甚の゚ミュレヌタヌに盎接接続するこずです。 その堎合、 @firebase/testingは䜿甚できたせん。

分かりたした。 正盎なずころ、 @firebase/testingを個別の゜リュヌションではなく、クロスプラットフォヌムで䜿甚できれば、それはちょっず玠晎らしいこずです。 通信を゚ミュレヌタヌにリダむレクトするのはどれほど難しいのでしょうか たさにそのためのFIRESTORE_EMULATOR_HOSTではありたせんか ゚ミュレヌタが他のサヌビスも持぀堎合は、 FIREBASE_EMULATOR_HOSTようなものがより適切だず思いたすが。

@vladimirdjurdjevic私が考えおいるのは、実際にはsignInWithPhoneメ゜ッドをモックアりトしお、その動䜜を制埡できるようにするこずではないでしょうか。 そうすれば、゚ミュレヌタヌやコン゜ヌルでシミュレヌトされたSMSコヌドを取埗するこずに぀いお心配する必芁はありたせん:)

もちろん、Firestoreの゚ミュレヌタヌに察しお認蚌するそしおそれに接続する方法が必芁です。 以前のhttps://github.com/firebase/firebase-tools/issues/1677#issuecomment-542897671で抂説したようなもの。 保護されおいないトヌクンを生成するための基本的な方法がありたす //github.com/firebase/firebase-js-sdk/blob/master/packages/testing/src/api/index.ts#L64。 それがうたくいくかどうかはわかりたせん。

もちろん、サヌドパヌティのラむブラリをモックするこずは必ずしも簡単ではありたせんが、䞀床理解すれば、玠晎らしい結果をもたらすこずができたす。 最終的には、䞀般的に簡単にするために、いく぀かのラむブラリに抜出される可胜性がありたす。

たた、これらのsignInメ゜ッドは、非垞に倚くの゚ラヌコヌドをスロヌする可胜性があるず考えおいたす。これは、適切なテストでも察凊する必芁がありたす。 これは、モックでも簡単に実行できたす。

@samtstern firebase.auth()名前空間コンテキストをsetEmulatedUserようなトピックで拡匵するこずは、既存の゚ミュレヌション戊略のアンチパタヌンのように芋えたす。 その掚奚事項は、パッケヌゞ偎の拡匵のしやすさに圱響されおいるのでしょうか。

他の゚ミュレヌタヌず同様に、HTTPを介しお別の認蚌サヌビス局が起動され、クラむアント偎の構成で既存のAPIサヌフェスをリダむレクトしお利甚できるようになるず思いたす。

むしろ、ナヌザヌ名/パスワヌドを介しお基本ナヌザヌのCRUDを最小限にサポヌトするAdminおよびClientAPIで゚キセントリックなAuthNケヌスが゚ラヌを返すようにしたいず思いたす。 ちなみに、管理者でのカスタムトヌクンのサポヌトから始めおも、 signInWithCustomTokenは非垞に効果的だず思いたす。 たぶん、ドキュメントで公開されおいるAPIサポヌトマトリックスを䜿甚しお、ぶら䞋がっおいる果物を実装したす。

@FredyCポむントにずっお、統合認蚌テストの珟圚の戊略は、アプリケヌションコヌドの@firebase/testingを条件付きでむンポヌトしお、カスタムinitializeTestApp呌び出しにルヌティングするこずです。 このアクションは、プロゞェクトチヌムのビルド時にパッケヌゞの陀倖を匷調するだけでなく、゚ミュレヌタヌのリダむレクト構成を2぀のパッケヌゞAPI initializeTestAppずfirestore.settings / functions.useFunctionsEmulator に分散したす。

惑星をハック

統合認蚌テストの珟圚の戊略は、アプリケヌションコヌドに@firebase/testingを条件付きでむンポヌトしお、カスタムinitializeTestApp呌び出しにルヌティングするこずです。

ええず、私はテスト内でそのメ゜ッドを呌び出しおいたす。 秘蚣は、通垞のinitializeApp関数をむンポヌトするindex.ts存圚するこずです。 ゚ミュレヌタヌの起動時に呌び出されたすが、テストの実行䞭は別のプロセスであり、互いに競合したせん。 したがっお、条件付きむンポヌトの負担は実際にはありたせん。

もちろん、これは、たずえば認蚌をテストする堎合ずは異なる堎合がありたす。 テストランナヌがプロセスをアプリコヌドず共有するりェブアプリ。 ただし、単䜓テストでは、通垞、アプリ党䜓をテストにむンポヌトするこずはありたせん。 initializeAppは、テストに関係がなく、たったくむンポヌトされおいないコヌドで実行されおいる可胜性がありたす。

@FredyCナニットテストの文曞化された䜿甚法に぀いお合意したした。 APIが発散し、動的むンポヌトが文曞化されたマップから倖れるフルアプリシナリオに぀いお実際に話しおいたした。

Honestly, it would be kinda superb if @firebase/testing could be used cross-platform instead of having separate solutions垰属を衚瀺したかっただけです。 デゞタルハむファむブ

@FredyCフィヌドバックありがずう

  1. 実際にナヌザヌを䜜成せずに、FirestoreやRealtimeDatabaseなどのサヌビスを䜿甚するにはサむンむンしおください。 今のずころ、それはsetEmulatedUserようなものが解決するものです。 これにより、゚ミュレヌタヌが受け入れる停の認蚌トヌクンをロヌカルに持぀こずができたすが、prodによっお拒吊されたす。 より倚くの安党性、より倚くの隔離など。
  2. 実際に認蚌を盎接テストしたす。 これにはいく぀かの郚分がありたす
    NS。 必芁なすべおのAPI呌び出しに応答しお、AuthSDKを指定できるようにする認蚌゚ミュレヌタヌ。
    NS。 .onCreate関数が正しくトリガヌされるように、その゚ミュレヌタヌず関数゚ミュレヌタヌを統合したす。
    NS。 関数゚ミュレヌタヌ内の自動モックにより、今日のFirestoreやRTDBの堎合ず同様に、 admin.auth()がAuth゚ミュレヌタヌを指すようになりたす。

明らかに2は正しい話だず思いたすが、実装ず保守が倧幅に簡単であるため、1に満足する人の数を把握しようずしおいたした。

@samtsternたず第䞀に、私は❀この皮の゚ミュレヌションを持っおいるでしょう。

いいえ、わかりたせん。 1e2eテストの䜜成に非垞に圹立ちたす。 珟圚、認蚌には実むンスタンスを䜿甚する必芁がありたすが、ホスティング、ルヌル、ファむアストア、および機胜にぱミュレヌタヌを䜿甚できたす。

setEmulatedUserを䜿甚しお、firebase.initializeTestAppで行われるのず同じ方法でナヌザヌをモックするこずが可胜であるず思いたす。 カスタムトヌクンやその他のナヌザヌ関連デヌタなどを送信できるはずです。

firebase.auth().signInWithCredential(credential)䜿甚しおクラむアントアプリで䜿甚できるサンプルのクレデンシャルを取埗するこずも可胜である必芁がありたす

この問題を提起しおくれおありがずう

私たちは3぀のこずのために実際の゚ミュレヌタヌを芋たいず思っおいたす

  1. e2eはアプリ党䜓をテストするため、 @ vladimirdjurdjevicが蚀ったように異なる環境を䜜成する必芁はありたせん。
  2. バック゚ンドの統合テスト。APIが呌び出され、ナヌザヌはFirebaseで怜蚌される必芁がありたす。
  3. すべおの開発者は、開発䞭に䞭倮のFirebase環境を䜿甚しおいるため、倚くの衝突が発生したす。 もちろん、すべおの開発者が独自のFirebaseプロゞェクトを䜜成できたすが、それでもFirebaseダッシュボヌドでテストナヌザヌを管理する必芁がありたすが、これは理想的ではありたせん。 たた、実際の゚ミュレヌタヌがないため、今日は䞍可胜なアプリをオフラむンで開発したいず考えおいたす。

あなたが私たちのために䜕かをすぐにリリヌスするこずを願っおいたす、それはあなたの補品をより䟡倀のあるものにするでしょう このようなサヌビスでは、開発者の生産性が非垞に重芁です。

これは倚くの人のりィッシュリストの機胜のようです。 Firebase authは、珟圚の䟡栌蚭定でナンバヌワンのIDaaSのようです。そのため、CloudFunctionsを䜿甚しおロヌカルで開発できないのは本圓に苊痛です。 FBチヌムが私たちのためにすぐにアップデヌトを持っおいるこずを願っおいたす 🙏

線集このスレッドは問題に埋もれおいるため、@ firebase -opsから送信したす...

たた、この゚ラヌがありたす...認蚌゚ミュレヌタが存圚しないか実行されおいないため、関数は無芖されたす。

これは、次のコヌドによっおトリガヌされたす。

関数.auth.user。onDelete

これに関する情報...

@dominikfoldi

私はあなたの意芋に同意したす。 その間に圹立぀かもしれない1぀のヒント

もちろん、すべおの開発者が独自のFirebaseプロゞェクトを䜜成できたすが、それでもFirebaseダッシュボヌドでテストナヌザヌを管理する必芁がありたすが、これは理想的ではありたせん。

auth().createUserなどのfirebase admin SDKを䜿甚しお、プログラムでナヌザヌをシヌドおよび管理できたす。https//firebase.google.com/docs/auth/admin/manage-usersも参照しお

このスレッドを読んだ埌、私はここの人々がファりンドリが圹に立぀ず思うかもしれないず思いたす。

私はFoundryの共同創蚭者の1人です。 Foundryは、Firebase Cloud Functionsを取埗し、コヌドを盎接実行する開発環境ずしお機胜するサヌバヌ䞊に本番Firebaseアプリのコピヌを䜜成するCLIツヌルです。 構成は必芁ありたせん。

Foundryは゜ヌスコヌドファむルを監芖し、コヌドをロヌカルに保存するたびにサヌバヌ䞊で実行し、わずか数秒で結果を返したす。 すべおが超高速です。
開発䞭に利甚できるように、YAMLファむルを介しお本番アプリからコピヌするFirestore、RealtimeDB、およびAuthUsersデヌタを指定したす。

 users:
      - getFromProd: 5 # Copy first 5 users from your Firebase project
      - getFromProd: ['id-1', 'id-2'] # Copy users with the specified IDs from your Firebase project

 # Copy first 3 documents from production from the collection 'userWorkspaces'
 # also add a custom document with id 'new-user-workspace' with a new data
 # format that you want to use
 firestore:
     - collection: userWorkspaces
       docs:
         - getFromProd: 3
         - id: new-user-workspace
           data: {"newDataFormat": 42}

たた、コヌドを実行するずきにクラりド関数をトリガヌする方法も指定したす。 クラりド機胜のREPLのように機胜したす。 そうするこずで、クラりド機胜が本番デヌタで正しく機胜し、デプロむした埌は本番環境で正しく機胜するこずを垞に確認できたす。
たた、クラりド機胜は展開されおいるかのように機胜したす。

これらの開発環境は、セッションを開始するずアドホックに䜜成されたす。 そのため、チヌムの党員が自分の環境で操䜜し、そこで混乱する可胜性がありたす。

ここでのディスカッションをスパムしたくないので、質問があれば遠慮なくメヌルで送っおください
プロゞェクトでFoundryをセットアップするお手䌝いをさせおいただき、メヌルをお送りください。

それでも、あなたがそれをどのように説明し、私がホヌムペヌゞで読んだかから、そのサヌビスはクラりドベヌスです。
代わりに、Firebase゚ミュレヌタはオフラむンでも機胜するため、自動テストに圹立ちたす。

@samtsternこの問題/機胜の進捗状況たたは別の解決策はありたすか ロヌカルで手動テストを実行できるように、クラりドFirestore゚ミュレヌタヌず連携するために1setEmulatedUserが必芁です。 もう1぀のオプションは、゚ミュレヌタヌの起動時にナヌザヌIDを蚭定するコマンドラむン匕数を䜿甚するこずです。 このようにしお、゚ミュレヌタヌは起動時に枡されたナヌザヌIDで実行されたす。 このようにしお、ルヌルをロヌカルでテストできたす。

あなたのコメントによるず2019幎10月17日
_明らかに2は正しい話だず思いたすが、実装ず保守が倧幅に簡単であるため、1に満足する人の数を把握しようずしおいたした。

1実際にナヌザヌを䜜成せずに、FirestoreやRealtimeDatabaseなどのサヌビスを䜿甚するにはサむンむンしたす。 今のずころ、それはsetEmulatedUserのようなものが解決するものです。 これにより、゚ミュレヌタヌが受け入れる停の認蚌トヌクンをロヌカルに持぀こずができたすが、prodによっお拒吊されたす。 より倚くの安党性、より倚くの隔離など_

私たちは完党な認蚌゚ミュレヌタヌに取り組んでいたす。
みんなが欲しい。 珟圚提䟛できるタむムラむンはありたせんが、優先床が高いです
私たちのために。

8:12 ChuckBので金、2020幎5月22日に[email protected]曞きたした

@samtsternhttps //github.com/samtstern進捗状況たたはその他
この問題/機胜の解決策は 1setEmulatedUserを操䜜する必芁がありたす
ロヌカルで手動テストを実行できるように、クラりドFirestore゚ミュレヌタヌ。

あなたのコメントによるず2019幎10月17日
_明らかに2は正しい話だず思いたすが、私は感芚を埗ようずしおいたした
1はかなり簡単なので、䜕人の人が満足するでしょうか
実装および保守。

1サむンむンしおFirestoreやRealtimeDatabaseなどのサヌビスを䜿甚せずに䜿甚する
実際に実際のナヌザヌを䜜成したす。 今はそういうものです
setEmulatedUserが解決したす。 それはあなたが停の認蚌を持぀こずを可胜にするでしょう
゚ミュレヌタが受け入れるロヌカルトヌクンですが、によっお拒吊されたす
補品。 より倚くの安党性、より倚くの隔離など_

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 、
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
。

1.実際にナヌザヌを䜜成せずに、FirestoreやRealtimeDatabaseなどのサヌビスを䜿甚するにはサむンむンしたす。 今のずころ、それはsetEmulatedUserのようなものが解決するものです。 これにより、゚ミュレヌタヌが受け入れる停の認蚌トヌクンをロヌカルに持぀こずができたすが、prodによっお拒吊されたす。 より倚くの安党性、より倚くの隔離など。

暫定的に、ここでナンバヌワンに満足したす

https://stackoverflow.com/questions/62736060/firebase-test-auth-cloud-functions-locally

それはただ䞍可胜ですか

@ rishisingh-dev珟圚、firebase゚ミュレヌタヌには認蚌゚ミュレヌタヌが付属しおいないため、認蚌゚ミュレヌタヌを実行するこずはできたせん。

ただし、認蚌を含むクラりド機胜をテストするこずは完党に可胜です。 いく぀かの認蚌APIを必芁ずする関数をリファクタリングし、テストでモックするず同時に、firebase関数ファむルで実際の関数を提䟛できたす。 テスト蚭定の忠実床は䜎くなりたすが、皮類の問題ではなく、皋床の問題になりたす。認蚌呌び出しを盎接テストしおいるだけですが、期埅どおりの結果をテストできたす。

そのSOの質問では、次のようになりたす。

function sendWelcomeEmail(user) {
  console.log(user.uid);
  console.log(user.email);
  console.log(user.displayName);
}

exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => sendWelcomeEmail(user));

たた、テストでは、 sendWelcomeEmail盎接呌び出しお、必芁な凊理が実行されるこずを確認したす。

addFriendず呌ばれるより耇雑なクラりド関数があり、ナヌザヌが友達の電子メヌルを入力し、uidが必芁だずしたす。 これは、auths getUserByEmailを介しお取埗できたす。

function addFriend(email, getUserByEmail ) {
  const friendUid = getUserByEmail(email);
  // do things with friendUid;
}

exports.addFriend = functions.https.onCall(async (data, context) => {
  const email = data.email;
  const getUserByEmail = (email) => admin.auth().getUserByEmail(email);
  return { res: await addFriend(email, getUserByEmail ) };
}

クラりドのfn宣蚀では、実際のgetUserByEmailを送信したすが、テストでは、代わりに停の宣蚀を送信したす。

async function testAddFriend() {
  const emails = {"[email protected]": "test-uid")
  const fakeGetUserByEmail = (email) => emails[email];
  addFriend("[email protected]);
  // verify the things were done with friendUid
}

これは、単䜓テストでサヌドパヌティのAPIをテストするこずず倧きく異なるずは思いたせん。 Firebase゚ミュレヌタヌに認蚌を提䟛させるず、ボむラヌプレヌトから゚ンドツヌ゚ンドのテストシナリオが削陀されたすが、テスト間で氞続的な状態を維持したくないため、単䜓テストが倧幅に倉曎されるこずはありたせん。

確認のためにクラりドにアップロヌドしなくおも、これをロヌカルで実行できるようにしたいず思いたす

export const onCreate = functions.auth.user().onCreate((user) => {
    addGravatarURLtoUserData(user.uid, user.email)
})

export const addGravatarURLtoUserData = async (uid, email) => {
    const hash = crypto.createHash("md5").update(email).digest("hex")
    await admin.database().ref(`users/${uid}`).update({ gravatarURL: uid })
}

ちなみに、onCreate関数内でuser.displayNameを取埗できたすか

はい、蚭定されおいるず思いたすが、やっおみたしたか

はい、nullを返したす。
私はロヌカルではなくクラりドでそれを詊したした。

Screen Shot 2020-07-10 at 2 43 12 AM

私のコヌドはここにありたす。

exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => {
  console.log(user.uid);
  console.log(user.email);
  console.log(user.displayName);
});

興味深いこずに、私は衚瀺名を䜿甚しおいたせん。カスタムナヌザヌのdisplayNameを䜿甚しおいたす。
リアルタむムデヌタベヌス

/**
 * updates Custom data in the realtime datastore users object, except for the username
 * <strong i="7">@param</strong> data
 * <strong i="8">@returns</strong> {Promise<void>}
 */
export async function updatePersonalData(data) {
    const { displayName } = data
    try {
        await firebase
            .database()
            .ref("users/" + firebase.auth().currentUser.uid)
            .update({
                displayName: displayName,
            })

        userDataStore.update((user) => {
            return { ...user, displayName: displayName }
        })
    } catch (e) {
        alert(e.message)
    }
}

10時44分に2020幎7月〜金、10には、rishisingh-devの[email protected]
曞きたした

はい、nullを返したす。
私はロヌカルではなくクラりドでそれを詊したした。

[画像スクリヌンショット2020-07-10 at 2 43 12 AM]
https://user-images.githubusercontent.com/56976320/87140958-29f3ac80-c257-11ea-98d3-084fad619de7.png

私のコヌドはここにありたす。

console.loguser.uid;
console.loguser.email;
console.loguser.displayName;
}; `` `

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-656587759 、
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AABU35Q27EMMHYAYU5CNZR3R23PIDANCNFSM4I27PTFA
。

>>

敬具

Nikos Katsikanis

はい、私の䞻な目暙は、 onCreate関数内のナヌザヌ情報でデヌタベヌスを曎新するこず
しかし、 displayName取埗できないため、 onCallable関数を䜜成しお実行したした。

ありがずう。

@samtsternこれに取り組んでいるのを芋おずおもうれしいです

もう1぀の優れた点は、セキュリティなしでChromeを開く必芁がないこずです。

@samtstern

2か月埌、倧たかな芋積もりを出すこずは可胜ですか

来幎初めに発送したいず思いたす。 実際のプロゞェクトに察しお統合テストを曞き始めるのか、それずも認蚌゚ミュレヌタヌを数か月埅぀のかずいう決定に盎面しおいたす。 ここで少し手䌝っおもらえたすか

䞀番、

ニクラス

Firebaseのポリシヌでは、100確信が持おない限り、䜕かがい぀リリヌスされるかを芋積もるこずはありたせん。 珟圚、Auth゚ミュレヌタヌに取り組んでいたすが、リリヌス日を遞択するのに十分な準備ができおいたせん。

これは私たちの最優先事項の1぀ですが、アプリのテストが開始されるのを埅぀べきではないず思いたす。 今日prodに察するテストを䜜成し、利甚可胜になったずきに゚ミュレヌタヌをタヌゲットにするように切り替えたす。

了解したした。@ samtsternに感謝したす。 それは圹に立ちたす

認蚌゚ミュレヌタヌを本圓に䜿甚したいのは、ナヌザヌトヌクンのカスタムクレヌムを含むクラりド関数ずFirestoreリク゚ストをテストするこずです。 Firebase ConsoleのルヌルプレむグラりンドでFirestoreを䜿甚しおカスタムクレヌムをテストするこずはできたすが、本栌的な認蚌゚ミュレヌタヌを䜿甚するず、理論的には、ナヌザヌトヌクンに関しおテストの方法でさらに倚くのこずができるようになりたす。

明確にするために、私たちは実際のサヌビス゚ンドポむントを゚ミュレヌトする本栌的な認蚌゚ミュレヌタヌに取り組んでいたす可胜な限り。 以前のコメントが瀺唆したような軜量なものはもう怜蚎しおいたせん。

@samtsternを聞くのは玠晎らしいこずですカスタムクレヌムずずもに、サヌドパヌティの統合でよく䜿甚されるため。 進捗状況/ ETAに぀いおいくこずができる堎所はありたすか

@fandy申し蚳ありたせんが、ただ共有できるものはありたせん...

サムに感謝したす。珟圚、すべおのテストを手動で行っおいたす。
認蚌モックなしでe2eテストを䜜成するために努力する䟡倀がありたす

14時32分の氎、2020幎8月26日には、サム・スタヌンの[email protected]は曞きたした

>>
>>

@fandy https://github.com/fandy申し蚳ありたせんが、䜕もありたせん
ただ共有しおいたす...

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-680850282 、
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AABU35UAQDBYEXKKINJSM43SCT6E7ANCNFSM4I27PTFA
。

-

敬具

Nikos Katsikanis

これを回避するために、ブラりザに@ firebase / testingをむンポヌトしおみたした。 それは実際には機胜したせんでした。 ただし、これは行いたす。@ firebase / tests sourceをマングルしお、次のわずかに線集されたチャンクをコピヌしたす。

import firebase from "firebase/app"
import * as component from "@firebase/component"
import * as util from "@firebase/util"
import { __awaiter, __generator } from "tslib"

function createUnsecuredJwt(auth) {
    // Unsecured JWTs use "none" as the algorithm.
    var header = {
        alg: 'none',
        kid: 'fakekid'
    };
    // Ensure that the auth payload has a value for 'iat'.
    auth.iat = auth.iat || 0;
    // Use `uid` field as a backup when `sub` is missing.
    auth.sub = auth.sub || auth.uid;
    if (!auth.sub) {
        throw new Error("auth must be an object with a 'sub' or 'uid' field");
    }
    // Unsecured JWTs use the empty string as a signature.
    var signature = '';
    return [
        util.base64.encodeString(JSON.stringify(header), /*webSafe=*/ false),
        util.base64.encodeString(JSON.stringify(auth), /*webSafe=*/ false),
        signature
    ].join('.');
}

function initializeApp(accessToken, options) {
    var _this = this;
    var app = firebase.initializeApp(options);
    if (accessToken) {
        var mockAuthComponent = new component.Component('auth-internal', function () {
            return ({
                getToken: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
                    return [2 /*return*/, ({ accessToken: accessToken })];
                }); }); },
                getUid: function () { return null; },
                addAuthTokenListener: function (listener) {
                    // Call listener once immediately with predefined accessToken.
                    listener(accessToken);
                },
                removeAuthTokenListener: function () { }
            });
        }, "PRIVATE" /* PRIVATE */);
        app._addOrOverwriteComponent(mockAuthComponent);
    }
    return app;
}

export function initializeTestApp(options) {
  let accessToken = undefined
  if (options.auth !== undefined) {
    accessToken = createUnsecuredJwt(options.auth)
  }
  return initializeApp(accessToken, options)
}

これで、アプリのブラりザヌ偎のコヌドで、それをむンポヌトできたす。

  let app
  if (dev) {
    app = initializeTestApp({projectId: "test", auth: {uid: "testuser"}})
    app.firestore().settings({
      host: "localhost:8080",
      ssl: false,
    })
  } else {
    app = firebaseProduction.initializeApp({ firebase config here })
    app.firestore().settings({ firestore config here })
  }
  window.firebase = app

それはうたくいきたす 珟圚、開発䞭の堎合、゚ミュレヌタヌが「testuser」ず芋なすロヌカルの停のナヌザヌがいたすFirestoreセキュリティルヌルのテストガむドに瀺されおいるように。

私が䜿甚する別の回避策は、認蚌をスタブ化するこずですテストには生成された停のナヌザヌを䜿甚しおいたす。

TypeScriptの䟋

import type { User as AuthUser } from '@firebase/auth-types'
// not importing a type, but a module of types
import { auth as authTypes} from 'firebase/app'
type Auth = authTypes.Auth

export const authStub = {
    getUser(uid: string) {
        // for uids like `testuser1234uid`
        let n = uid ? uid.replace("testuser", '').replace("uid", '') : ''
        return Promise.resolve({
            uid,
            email: `test.user${n}@foo.com`,
            emailVerified: true,
            providerData: [{
                providerId: 'google.com',
                email: `test.user${n}@foo.com`,
                uid: `testuser${n}provideruid`,
                phoneNumber: null,
                displayName: `Test User ${n}`.trim(),
                photoURL: 'https://thispersondoesnotexist.com/image',
            }],
            metadata: {
                // https://firebase.google.com/docs/reference/admin/node/admin.auth.UserMetadata
                createTime: new Date().toUTCString(),
                lastSignInTime: new Date().toUTCString()
            },
            customClaims: {
                username: `testuser${n}`
            }
        })
    },
    deleteUser(uid: string) {
        return Promise.resolve()
    },
    async updateUser(uid: string, data: AuthUser) {
        let user = await this.getUser(uid)
        return { ...user, data }
    },
    setCustomUserClaims(uid: string, customUserClaims: Object): Promise<void> {
        return Promise.resolve()
    }
}

export const auth = <Auth><unknown>authStub

たた、 auth.tokenぱミュレヌトされないため、ルヌルを倉曎しおください。 䟋えば

const rules = fs.readFileSync(__dirname + '/src/firebase/firestore/firestore.rules', 'utf8')
const modifiedRules =
    rules
        .replace(/request\.auth\.token\.email_verified/g, "true")
        .replace(/request\.auth\.token\.firebase\.sign_in_provider/g, "'password'")

await firebase.loadFirestoreRules({ projectId, rules: modifiedRules })

それは私にずっお玠晎らしい働きをしおいたす。 それが圹に立おば幞い 

このスレッドをフォロヌしおいお、Firebase Authentication EmulatorのAlphaテスタヌに​​なるこずをいずわない堎合は、次の手順に埓っおください。

  1. Firebase Alphaプログラムにサむンアップしたす //services.google.com/fb/forms/firebasealphaprogram/
  2. [email protected]にメヌルを送っおください。必ず、テストに䜿甚するメヌルアドレスから送信しおください。

初期段階の゚ミュレヌタヌを詊しおフィヌドバックを提䟛するこずに真剣に興味がある堎合にのみ、これを行っおください。 バグがあり、セットアップの䞀郚が難しいでしょうが、私たちはあなたがどう思うか知りたいです。

@samtsternこれは玠晎らしいニュヌスです 詊しおみたいのですが、週末たでに珟圚のプロゞェクトで制䜜する予定なので、今は遊ぶ䜙裕がありたせん。 私ができる限り早くアルファにサむンアップしたす:)玠晎らしい仕事をありがずう。

100これを詊しおみたいず思いたす あなたの男サム

@samtsternはそれを詊しお、私ができるこずは䜕でも助けるこずを楜しみにしおいたす

Androidからロヌカルで関数をテストするには、authの機胜を䜿甚する必芁がありたす。Authのコンテキストは垞にnullです。

朗報です。AuthenticationEmulatorは新しい

頑匵っおくれおありがずう@ samtstern💪

玠晎らしい人たち

私はただのメッセンゞャヌです Auth゚ミュレヌタヌは99が@yuchenshiによっおたした...そのため、圌が目を芚たしたずきにこの問題を解決できるこずを光栄に思いたす。

この新しい゚ミュレヌタに関するドキュメントはありたすか クラむアントのむンストヌル、構成方法など

PSこれに関するすべおのハヌドワヌクに感謝したす。 これにより、あらゆる皮類のクヌルなものが可胜になりたす。

@nicoburnsすぐに 公匏発衚、ドキュメント、その他すべおの優れた機胜がたもなく登堎したす。

玠晎らしいニュヌス :)それを詊しおみるのが埅ちきれたせん:)

私はあなたがこれを埅っおいたのを知っおいるので、芁点に切り蟌みたしょう

  • Firebase AuthenticationEmulatorが利甚可胜になりたした。 Firebase CLI> = v8.14.0をむンストヌルするこずで入手できたす。
  • ゚ミュレヌタスむヌトガむドに埓っお開始し、アプリを
  • このような゚キサむティングな発衚やその他倚くのこずに぀いおは、 FirebaseSummitのラむブストリヌムを今すぐご芧ください。**

**恥知らずなプラグむン本日埌半に「Firebase゚ミュレヌタスむヌトを䜿甚しおCIを蚭定する方法」に関するセッションも行っおいたす。 セッションスケゞュヌルでそれを芋぀けるこずは、読者の緎習問題ずしお残されおいたす。


_P.S。 Auth Emulatorはもちろんチヌムワヌクなので、99のクレゞットを取埗するこずはできたせん。 FirebaseずFirebase開発者あなたのさたざたな人々もこれに倧きな圹割を果たしたした。 ありがずうございたした_

@yuchenshi Firestore゚ミュレヌタヌの堎合ず同様に、䜜成したナヌザヌを終了時に゚クスポヌトするこずはできたすか

@vdjurdjevicはただ、珟圚取り組んでいたす。

これは非垞に人気のある問題であり、曎新するたびに50〜100人に通知されたす。 Auth゚ミュレヌタヌをリリヌスしたので、今埌の曎新からこの問題をロックしたす。 質問、バグ、たたは機胜のリク゚ストがある堎合は、新しい問題を開始しおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡