TypeError:firestoreService.snapshot_不是函数

时间:2018-12-11 11:44:20

标签: node.js firebase google-cloud-firestore google-cloud-functions

我一直在使用firebase函数测试对我的函数进行一些测试。我有一些代码应该发布到Firestore中,基本上与示例在实时数据库示例中显示的方式相同:

exports.addMessage = functions.https.onRequest((req, res) => {
  const original = req.query.text;

  admin.firestore()
    .collection('messages')
    .add({ original })
    .then(documentReference => res.send(documentReference))
    .catch(error => res.send(error));
});

为了进行测试,我使用sinon,mocha和chai欺骗了一些基本功能。这是我当前的测试,但失败,并显示以下错误消息:TypeError: firestoreService.snapshot_ is not a function

 describe('addMessage', () => {
    // add message should add a message to the database
    let oldDatabase;
    before(() => {
        // Save the old database method so it can be restored after the test.
        oldDatabase = admin.firestore;
    });

    after(() => {
        // Restoring admin.database() to the original method.
        admin.firestore = oldDatabase;
    });

    it('should return the correct data', (done) => {
        // create stubs
        const refStub = sinon.stub();

        // create a fake request object
        const req = {
            query : {
                text: 'fly you fools!'
            }
        };
        const snap = test.firestore.makeDocumentSnapshot({ original: req.query.text }, 'messages/1234');

        // create a fake document reference
        const fakeDocRef = snap._ref;

        // create a fake response object
        const res = {
            send: returnedDocRef => {
                // test the result 
                assert.equal(returnedDocRef, fakeDocRef);
                done();
            } 
        };

        // spoof firestore
        const adminStub = sinon.stub(admin, 'firestore').get(() => () => {
            return {
                collection: () => {
                    return {
                        add: (data) => {
                            const secondSnap = test.firestore.makeDocumentSnapshot(data, 'messages/1234');
                            const anotherFakeDocRef = secondSnap._ref;
                            return Promise.resolve(anotherFakeDocRef);
                        }
                    }
                }
            }
        });

        // call the function to execute the test above
        myFunctions.addMessage(req, res);
    });
});

我的问题是我该怎么解决?

我以前进行的测试刚刚通过了第一个快照和fakeDocRef,并且测试通过了,但是一旦我使用新的伪造文档引用解决了诺言,它就会失败...

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

有三种不同的呼叫类型,分别是:

  
      
  1. Operating on the Collections
  2.   
  3. Operating on the Documents
  4.   
  5. 对查询结果进行操作。
  6.   

必须一致使用它们。 请参阅文档以查看difference operation on the collection and the document