Tìm kiếm trang web

typescript - kiểm tra các chức năng đám mây thất bại và context.params bị thiếu trong hàm kích hoạt


Tôi đang theo hướng dẫn này về kiểm thử đơn vị các hàm Firebase: https://fireship.io/lessons/testing-cloud-functions-in-firebase/

Tôi đã thêm một bài kiểm tra đơn vị cho một trigger cơ sở dữ liệu thời gian thực onCreate và trong khi dữ liệu đến trong nó, context.params lại xuất hiện trống trong bài kiểm tra đơn vị. nên tôi có

    test('checks that the user gets created', async () => {
    const userId = 'aaaaaaa';
    const path = `/users/${userId}`;
    const data = {
      "id": userId,
      "firstName": "Dan",
      "phoneNumber": "+11111111111",
      "carInfo": {
        "color": "blue",
        "make": "Ford",
        "model": "Focus",
        "plate": "BV-11-AAA"
      }
    };

    // Create a Database snapshot
    const snap = testEnv.database.makeDataSnapshot(data, path);

    // Execute it
    await wrapped(snap);

    const after = await admin.database().ref(path).once('value');
    const afterValue = after.val();

    expect(afterValue.phoneNumber).toBe('+11111111111')

  });

và chức năng thực tế của tôi (index.ts) là:

export const newUserCreated = database.ref('/users/{userId}').onCreate(async (snapshot: DataSnapshot, context) => {
    console.log('context params : ', context.params);
    const user = snapshot.val();
    await createStripeCustomerHandler(user, snapshot.key);
});

Tôi nhận được payload thực sự trong hàm xử lý của mình, NHƯNG:

Có 2 vấn đề với nó:

  1. Nó thực sự không thực hiện lưu vào cơ sở dữ liệu, vì vậy bản thân bài kiểm tra thất bại (afterValue là null) (có thể thực sự là hành vi mong đợi. không chắc chắn)
  2. Các tham số ngữ cảnh xuất hiện dưới dạng trống khi thực hiện kiểm thử đơn vị, vì vậy nó in ra context params : {}. Tôi có cần gửi các tham số cho ngữ cảnh thủ công không? từ lệnh testEnv.database.makeDataSnapshot?

Tôi có đang làm gì sai không hay tôi có bỏ lỡ điều gì không? Cảm ơn trước.

Câu trả lời #1

Hôm nay, hơn hai năm sau, tôi gặp cùng một vấn đề và đã tìm ra một giải pháp đang ẩn ngay trước mắt trong tài liệu.

Vì vậy đây là câu trả lời trong trường hợp ai đó tìm thấy điều này và chưa xem giải pháp trong tài liệu.

Trong tài liệu có nhiều cách để truyền dữ liệu vào một hàm đang được kiểm thử: https://firebase.google.com/docs/functions/unit-testing

Đối với trường hợp hiện tại của bạn, bạn có thể đã sử dụng cách này để gọi hàm được bọc nhằm truyền các tham số cho hàm trong quá trình kiểm tra.

wrapped(data, {
  params: {
    userId: '234234'
  }
});