如何在本地测试`functions.https.onCall` firebase云函数?

mkshixfv  于 2023-08-07  发布在  其他
关注(0)|答案(7)|浏览(157)

我似乎无法在Firebase Documentation中找到这个解决方案。
我想在本地测试我的functions.https.onCall函数。是否可以使用shell或以某种方式将我的客户端(启用了firebase SDK)连接到本地服务器?
我希望避免每次都为了测试onCall函数的更改而部署。

我的代码

功能说明:

exports.myFunction = functions.https.onCall((data, context) => {
  // Do something
});

字符串
客户:

const message = { message: 'Hello.' };

firebase.functions().httpsCallable('myFunction')(message)
  .then(result => {
    // Do something //
  })
  .catch(error => {
    // Error handler //
  });

ldxq2e6h

ldxq2e6h1#

对于local,你必须调用(在firebase.initializeApp之后)

firebase.functions().useFunctionsEmulator('http://localhost:5000')

字符串

ndh0cuux

ndh0cuux2#

有一个简单的技巧,如何简化onCall函数测试。只需将onCall函数回调声明为本地函数并测试它:

export const _myFunction = (data, context) => { // <= call this on your unit tests
  // Do something
}

exports.myFunction = functions.https.onCall(_myFunction);

字符串
现在,您可以使用在函数调用中定义的输入,使用普通函数对所有情况进行变量处理。

irtuqstp

irtuqstp3#

虽然官方的Firebase Cloud Function文档尚未更新,但您现在可以将firebase-functions-testonCall函数一起使用。
你可以看到一个example in their repository
我已经设法使用jest测试了我的TypeScript函数,这里是一个简短的例子。这里有一些特殊之处,比如导入顺序,所以一定要阅读文档:-)

/* functions/src/test/index.test.js */
/* dependencies: Jest and jest-ts */

const admin = require("firebase-admin");
jest.mock("firebase-admin");
admin.initializeApp = jest.fn(); // stub the init (see docs)
const fft = require("firebase-functions-test")();

import * as funcs from "../index";

// myFunc is an https.onCall function
describe("test myFunc", () => {
  // helper function so I can easily test different context/auth scenarios
  const getContext = (uid = "test-uid", email_verified = true) => ({
    auth: {
      uid,
      token: {
        firebase: {
          email_verified
        }
      }
    }
  });
  const wrapped = fft.wrap(funcs.myFunc);

  test("returns data on success", async () => {
    const result = await wrapped(null, getContext());
    expect(result).toBeTruthy();
  });

  test("throws when no Auth context", async () => {
    await expect(wrapped(null, { auth: null })).rejects.toThrow(
      "No authentication context."
    );
  });
});

字符串

vfh0ocws

vfh0ocws4#

Callable只是具有特定格式的HTTPS函数。您可以像HTTPS函数一样进行测试,只是您必须编写代码以将其作为defined in the documentation协议交付。

dsekswqp

dsekswqp5#

你应该首先检查开发环境,然后将你的函数指向本地仿真器。
对于JS:

//after firebase init
if (window.location.host.includes("localhost") ||
    window.location.host.includes("127.0.0.1")
) {
    firebase
      .app()
      .functions()  //add location here also if you're mentioning location while invoking function()
      .useFunctionsEmulator("http://localhost:5001");
  }

字符串
或者如果你不创建firebase的示例

//after firebase init
if (window.location.host.includes("localhost") || 
   window.location.host.includes("127.0.0.1")
) {
    firebase
      .functions()
      .useFunctionsEmulator("http://localhost:5001");
  }


或者当从后端(node.js)提供页面时:

//after firebase init
if (process.env.NODE_ENV === 'development') {
  firebase.functions().useFunctionsEmulator('http://localhost:5001');
}

uqxowvwt

uqxowvwt6#

如果你使用的是angularfire,把它添加到你的app.module中

{
  provide: FirestoreSettingsToken,
  useValue: environment.production
    ? undefined
    : {
        host: "localhost:5002",
        ssl: false
      }
}

字符串

ippsafx7

ippsafx77#

HTTPSCallable函数中有一个函数run
“以提供的数据作为输入执行处理程序函数。用于单元测试”。
您可以简单地这样做:

test("something", async () =>
{
  const res = await myCallableFunction.run({
    data: {
      // arguments
    },
    auth: { // optional
      uid: "test-user",
      token: { email: "test-email" } as any,
    },
    rawRequest: {} as any,
  });
});

字符串

相关问题