Kiểm thử các hàm có tính tương tác

Vỏ Cloud Functions cung cấp một vỏ tương tác để gọi các hàm bằng dữ liệu thử nghiệm. Vỏ này hỗ trợ tất cả các loại trình kích hoạt.

Thiết lập thông tin đăng nhập quản trị (không bắt buộc)

Nếu muốn các bài kiểm thử hàm của bạn tương tác với API của Google hoặc các API khác của Firebase thông qua SDK của Firebase dành cho quản trị viên, bạn có thể cần thiết lập thông tin đăng nhập quản trị.

  • Trình kích hoạt Cloud FirestoreRealtime Database đã có đủ thông tin đăng nhập và không yêu cầu thiết lập bổ sung.
  • Tất cả các API khác, bao gồm cả API của Firebase (chẳng hạn như AuthenticationFCM) hoặc API của Google (chẳng hạn như Cloud Translation hoặc Cloud Speech), đều yêu cầu các bước thiết lập được mô tả trong phần này. Điều này áp dụng cho cả trường hợp bạn đang sử dụng vỏ Cloud Functions hoặc firebase emulators:start.

Cách thiết lập thông tin đăng nhập quản trị cho các hàm được mô phỏng:

  1. Mở ngăn Tài khoản dịch vụ của bảng điều khiển Google Cloud.
  2. Đảm bảo rằng bạn đã chọn App Engine tài khoản dịch vụ mặc định rồi sử dụng trình đơn tùy chọn ở bên phải để chọn Tạo khoá.
  3. Khi được nhắc, hãy chọn JSON cho loại khoá rồi nhấp vào Tạo.
  4. Thiết lập thông tin đăng nhập mặc định của Google để trỏ đến khoá đã tải xuống:

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

Sau khi hoàn tất các bước này, các bài kiểm thử hàm của bạn có thể truy cập vào API của Firebase và Google bằng SDK quản trị. Ví dụ: khi kiểm thử trình kích hoạt Authentication, hàm được mô phỏng có thể gọi admin.auth().getUserByEmail(email).

Phân phát các hàm bằng vỏ Cloud Functions

Vỏ Cloud Functions mô phỏng tất cả các loại trình kích hoạt hàm bằng một vỏ tương tác để gọi các hàm bằng dữ liệu thử nghiệm. Các tuỳ chọn sẽ khác nhau tuỳ theo loại hàm, nhưng định dạng sử dụng cơ bản là:

myFunctionName(data, options)

Tham số data là bắt buộc đối với trình kích hoạt Cơ sở dữ liệu theo thời gian thực, Cloud Firestore và PubSub, đồng thời không bắt buộc đối với tất cả các loại hàm khác. Ngoài ra, tham số options không bắt buộc chỉ hợp lệ đối với các hàm Cơ sở dữ liệu theo thời gian thực và Cloud Firestore.

Bạn có thể tải dữ liệu thử nghiệm từ một tệp cục bộ bằng cách lưu tệp đó dưới dạng một biến và gọi một hàm bằng biến đó:

var data = require('./path/to/testData.json');
myFunction(data);

Cài đặt và định cấu hình vỏ Cloud Functions

Để sử dụng tính năng này, firebase-tools phải có phiên bản tối thiểu là 3.11.0 và SDK firebase-functions phải có phiên bản tối thiểu là 0.6.2. Để cập nhật cả hai, hãy chạy các lệnh sau trong thư mục functions/ cho dự án của bạn:

npm install --save firebase-functions@latest
npm install -g firebase-tools

Nếu bạn đang sử dụng các biến cấu hình hàm tuỳ chỉnh, trước tiên, hãy chạy lệnh để lấy cấu hình tuỳ chỉnh (chạy lệnh này trong thư mục functions) trong môi trường cục bộ:

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

Cuối cùng, hãy chạy vỏ bằng lệnh sau:

firebase functions:shell

Gọi các hàm HTTPS

Để gọi các hàm HTTPS trong vỏ, cách sử dụng cũng giống như mô-đun request NPM, nhưng hãy thay thế request bằng tên của hàm mà bạn muốn mô phỏng. Ví dụ:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

Gọi các hàm HTTPS có thể gọi

Khi gọi các hàm HTTPS có thể gọi cục bộ, bạn cần cung cấp dữ liệu thử nghiệm thích hợp.

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

Bạn có thể truyền Firebase-Instance-ID-token làm tham số thứ hai (không bắt buộc). Tham số này phải là một chuỗi.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

Bạn hiện không thể mô phỏng context.auth.

Gọi các hàm Cơ sở dữ liệu theo thời gian thực

Khi chạy các hàm Cơ sở dữ liệu theo thời gian thực cục bộ, bạn cần cung cấp dữ liệu thử nghiệm thích hợp. Điều này thường có nghĩa là cung cấp dữ liệu thử nghiệm mới cho các thao tác onCreate, dữ liệu cũ/đã xoá cho các thao tác onDelete và cả hai cho các hàm onUpdate hoặc onWrite:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

Ngoài các tuỳ chọn before/after, vỏ này còn cung cấp tuỳ chọn params để sử dụng trong việc mô phỏng ký tự đại diện trong một đường dẫn:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

Theo mặc định, vỏ này chạy các hàm Cơ sở dữ liệu theo thời gian thực với đặc quyền quản trị (tài khoản dịch vụ). Hãy sử dụng tuỳ chọn auth để chạy các hàm dưới dạng một người dùng cuối cụ thể hoặc dưới dạng người dùng chưa xác thực:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

Gọi các hàm Firestore

Khi chạy các hàm Firestore cục bộ, bạn cần cung cấp dữ liệu thử nghiệm thích hợp. Điều này thường có nghĩa là cung cấp dữ liệu thử nghiệm mới cho các thao tác onCreate, dữ liệu cũ/đã xoá cho các thao tác onDelete và cả hai cho các hàm onUpdate hoặc onWrite. Xin lưu ý rằng dữ liệu Firestore phải là các cặp khoá-giá trị; hãy xem bài viết Các loại dữ liệu được hỗ trợ.

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

Ngoài các trường before/after của đối tượng data, bạn có thể sử dụng các trường params trên đối tượng options để mô phỏng ký tự đại diện trong tên tài liệu:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

Vỏ này luôn chạy các hàm Firestore với đặc quyền quản trị, tức là mô phỏng sự kiện tạo/cập nhật/xoá như thể sự kiện đó được thực hiện bởi người dùng có quyền quản trị.

Gọi các hàm PubSub

Đối với các hàm PubSub, hãy chèn tải trọng thông báo vào một thực thể Buffer và thêm các thuộc tính dữ liệu (không bắt buộc) như minh hoạ:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

Gọi các hàm Analytics

Bạn có thể gọi một hàm Analytics mà không cần dữ liệu nào bằng cách chạy myAnalyticsFunction() trong vỏ. Để chạy hàm bằng dữ liệu thử nghiệm, bạn nên xác định một biến cho các trường dữ liệu sự kiện cụ thể mà hàm của bạn cần:

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

Gọi các hàm Storage và Auth

Đối với các hàm Storage và Auth, hãy gọi hàm cục bộ bằng dữ liệu thử nghiệm mà bạn muốn xem bên trong hàm. Dữ liệu thử nghiệm của bạn phải tuân theo các định dạng dữ liệu tương ứng:

Chỉ định các trường mà mã của bạn phụ thuộc vào hoặc không chỉ định trường nào nếu bạn chỉ muốn chạy hàm.