如何使用 nock 来模拟 NodeJS 中的 Firebase/Firestore?

ves*_*sii 5 javascript node.js firebase nock google-cloud-firestore

我有一个用 NodeJS 编写的 REST API。REST API 获取文件和信息,然后将文件上传到驱动器并将信息存储在我的 Firebase/Firestore 数据库中。我正在尝试编写测试来测试我的 REST API,因此我需要模拟 Firestore。我已经通过nock跟踪googleapis. 现在我正在尝试对 Firestore 做同样的事情。

我尝试了不同的方法,例如,我尝试过的身份验证(基于文档):

nock('https://firestore.googleapis.com/$discovery/rest')
.persist()
.post('')
.reply(200, { 'access_token': 'abc', 'refresh_token': '123', 'expires_in': 10 })
Run Code Online (Sandbox Code Playgroud)

但诺克并没有遵循这些要求。如何使用nock来跟踪以下代码?包实际上是否firebase向 API 发出请求?

const firebase = require("firebase");

// Required for side-effects
require("firebase/firestore");

// First code - authenatiocation
firebase.initializeApp(firebaseConfig);
db = firebase.firestore();

// ...
// Second code - Get data from DB
const snapshot = await db.collection(collection).orderBy("timestamp", "desc").get();

// ...
// Third code - upload new report
const response = await db.collection(collection).doc(document_id).set(data);
Run Code Online (Sandbox Code Playgroud)

如果不可能nock,那么可以实现吗?

Pra*_*mar 0

有人可能会说,存根 Firebase 方法比模拟库内部可能进行的任何 API 调用更有意义。后者假设了解库的内部功能,但没有充分利用抽象的好处。

您可以使用sinon来存根 Firebase 方法。就像是,

db = firebase.firestore();

const stub = sinon.stub(db, 'collection')
  .returns({
    orderBy: sinon.stub().returns({
      get: sinon.stub().returns(yourDocObjectHere)
    }),
    doc: sinon.stub().returns({
      set: sinon.stub().returns(someObjectHere)
    })    
  })
Run Code Online (Sandbox Code Playgroud)

然后断言像

sinon.assert.calledWith(db.collection.orderBy, 'timestamp', 'desc');
Run Code Online (Sandbox Code Playgroud)