runTransaction 中的模拟交易

mock transaction in runTransaction

我想在 runTransaction 函数中模拟代码。

示例代码:

await admin.firestore().runTransaction(async transaction => {
  const hubDocument = admin.firestore().collection("Acme").doc('4');
  const hubData = (await transaction.get(hubDocument)).data();
  newData = {
    ...hubData,
    someAttribute: 'some new value'
  };
  transaction.update(hubDocument, newData);
})

我想模拟 transaction,检查它是否使用正确的数据调用 etc.pp。

我设法模拟了 firestore() 但不知道如何模拟 transaction 参数。

我还没有测试过这个,但我想像这样的东西应该可以解决问题:

import { Transaction } from '@google-cloud/firestore';

const origTransactionGet = Transaction.prototype.get
Transaction.prototype.get = function () {
   console.log(arguments, "< Intercepted Transaction.prototype.get")
   return origTransactionGet.apply(this, arguments)
}

// your code
await admin.firestore().runTransaction(async transaction => {
  const hubDocument = admin.firestore().collection("Acme").doc('4');
  const hubData = (await transaction.get(hubDocument)).data();
  newData = {
    ...hubData,
    someAttribute: 'some new value'
  };
  transaction.update(hubDocument, newData);
})

正如@FiodorovAndrei 评论的那样,如果您使用 jest,另一种选择可能更舒适,那就是只使用 firestore-jest-mock 来模拟 Firestore 功能。