web-dev-qa-db-ja.com

ユニットテスト中にadmin.firestore()をモックすることはできません

私は読んでいます firebaseのGoogle Cloud関数をモックする方法 そして次のコードを適切にモックする問題があります:

_const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
_

リンクの例では、次のコードを使用してinitializeAppをモックします。これは機能します

_admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
_

現在、admin.firestoreはfirebase-namespace.jsで次のように定義されています。

_Object.defineProperty(FirebaseNamespace.prototype, "firestore", {
    get: function () {
        var ns = this;
        var fn = function (app) {
            return ns.ensureApp(app).firestore();
        };
        return Object.assign(fn, require('@google-cloud/firestore'));
    },
    enumerable: true,
    configurable: true
});
_

これをスタブ化するためにさまざまなことを試みましたが、失敗します

  1. 結果は_firestore is not a function_になります:

    _    Object.defineProperty(admin, "firestore", {
            get: function () {
                return 32;
            }
        });
    _
  2. Firestore()をまったくモックせず、ハードに失敗する元の関数を呼び出します。

    _    sinon.stub(admin, 'firestore').returns({get() { }});
    _
  3. TypeError:存在しない独自のプロパティをスタブできませんget

    _   firestoreStub = sinon.stub(admin.firestore, 'get').callsFake(function () {return {data:"Foo"}});
    _

admin.firebase()が実際に何であるかを理解していません。プロパティのゲッターをモックするとき、AFAIは関数admin.firebase()ではなく_admin.firebase_を呼び出すため、プロパティのようには見えません。ただし、関数を介してモックすることもできません。

12
Samuel

本当に時間がかかりすぎました。

admin.firebase()をモックできるようにするには、プロパティのゲッター関数が実際に関数を返すである必要があります。

私の最初の仮定は、firebase()は関数であり、そうではなかったというものでした。次に、実装を見て、これがカスタムゲッターを持つプロパティであることがわかりました。しかし、私はゲッターを介していくつかのjsonデータブロックを返そうとしました。

最初は、admin.firestoreが実際にプロパティであることを理解できませんでしたが、プロパティを関数として呼び出さなければならない理由についてのキーがありませんでした。これは通常、プロパティ自体には必要ありません。

ポイントに到達した後、プロパティのゲッターが実際に関数を返し、admin.firebase()は次のように読み取ることができることを理解しました

var method = admin.firebase; // calling the property getter function
method(); // assuming the getter returned a function object

だから私の将来の自己のために;)これはトリックを行います:

sinon.stub(admin, 'firestore')
   .get(function() { 
       return function() { 
           return "data";
       }
   });

もともと私はやろうとしていました

sinon.stub(admin, 'firestore').get( function () { return "data"; } );admin.firestore()が最終的に"data"()になり、意味がないため失敗しました。

14
Samuel