تست توابع به صورت تعاملی

پوسته توابع ابری (Cloud Functions shell) یک پوسته تعاملی برای فراخوانی توابع با داده‌های آزمایشی ارائه می‌دهد. این پوسته از همه انواع تریگر (trigger) پشتیبانی می‌کند.

تنظیم اعتبارنامه‌های مدیر (اختیاری)

اگر می‌خواهید تست‌های توابع شما از طریق Firebase Admin SDK با APIهای گوگل یا سایر APIهای فایربیس تعامل داشته باشند، ممکن است لازم باشد اعتبارنامه‌های ادمین را تنظیم کنید.

  • تریگرهای Cloud Firestore و Realtime Database از قبل اعتبارنامه‌های کافی دارند و نیازی به تنظیمات اضافی ندارند .
  • تمام APIهای دیگر، از جمله APIهای Firebase مانند Authentication و FCM یا APIهای Google مانند Cloud Translation یا Cloud Speech، به مراحل راه‌اندازی شرح داده شده در این بخش نیاز دارند. این موضوع چه از پوسته Cloud Functions و چه firebase emulators:start استفاده کنید، صدق می‌کند.

برای تنظیم اعتبارنامه‌های مدیر برای توابع شبیه‌سازی شده:

  1. پنل حساب‌های سرویس (Service Accounts) کنسول Google Cloud را باز کنید.
  2. مطمئن شوید که حساب سرویس پیش‌فرض App Engine انتخاب شده است و از منوی گزینه‌ها در سمت راست برای انتخاب Create key استفاده کنید.
  3. وقتی از شما خواسته شد، نوع کلید را JSON انتخاب کنید و روی Create کلیک کنید.
  4. اعتبارنامه‌های پیش‌فرض گوگل خود را طوری تنظیم کنید که به کلید دانلود شده اشاره کنند:

    یونیکس

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

    ویندوز

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

پس از انجام این مراحل، تست‌های توابع شما می‌توانند با استفاده از Admin SDK به Firebase و Google APIs دسترسی داشته باشند. برای مثال، هنگام تست یک تریگر Authentication ، تابع شبیه‌سازی شده می‌تواند admin.auth().getUserByEmail(email) را فراخوانی کند.

ارائه توابع با استفاده از پوسته توابع ابری

پوسته توابع ابری (Cloud Functions shell) انواع محرک‌های تابع را با یک پوسته تعاملی برای فراخوانی توابع با داده‌های آزمایشی شبیه‌سازی می‌کند. گزینه‌ها بر اساس نوع تابع متفاوت هستند، اما قالب استفاده اولیه به شرح زیر است:

myFunctionName(data, options)

پارامتر data برای triggerهای Realtime Database، Cloud Firestore و PubSub الزامی و برای سایر انواع توابع اختیاری است. همچنین، پارامتر options اختیاری فقط برای توابع Realtime Database و Cloud Firestore معتبر است.

به صورت اختیاری، می‌توانید داده‌های تست را از یک فایل محلی با ذخیره فایل به عنوان یک متغیر و فراخوانی یک تابع با آن بارگذاری کنید:

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

نصب و پیکربندی پوسته Cloud Functions

برای استفاده از این ویژگی، firebase-tools باید حداقل نسخه 3.11.0 و firebase-functions SDK باید حداقل نسخه 0.6.2 را داشته باشند. برای به‌روزرسانی هر دو، دستورات زیر را در دایرکتوری functions/ پروژه خود اجرا کنید:

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

اگر از متغیرهای پیکربندی توابع سفارشی استفاده می‌کنید، ابتدا دستور زیر را برای دریافت پیکربندی سفارشی خود (این دستور را در دایرکتوری functions اجرا کنید) در محیط محلی خود اجرا کنید:

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

در نهایت، پوسته را با دستور زیر اجرا کنید:

firebase functions:shell

فراخوانی توابع HTTPS

برای فراخوانی توابع HTTPS در پوسته، نحوه‌ی استفاده مشابه ماژول request NPM است، اما به جای request ، نام تابعی را که می‌خواهید شبیه‌سازی کنید، قرار دهید. برای مثال:

# 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' })

فراخوانی توابع قابل فراخوانی HTTPS

هنگام فراخوانی توابع HTTPS Callable به صورت محلی، باید داده‌های آزمایشی مناسبی را ارائه دهید.

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

به صورت اختیاری، می‌توانید یک Firebase-Instance-ID-token به عنوان پارامتر دوم ارسال کنید. این باید یک رشته باشد.

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

شبیه‌سازی context.auth در حال حاضر در دسترس نیست.

فراخوانی توابع پایگاه داده بلادرنگ

هنگام اجرای توابع پایگاه داده Realtime به صورت محلی، باید داده‌های آزمایشی مناسبی را ارائه دهید. این به طور کلی به معنای ارائه داده‌های آزمایشی جدید برای عملیات onCreate ، داده‌های قدیمی/حذف شده برای عملیات onDelete و هر دو برای توابع onUpdate یا 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' })

علاوه بر گزینه‌های before/after ، پوسته گزینه params را برای استفاده در شبیه‌سازی کاراکترهای جایگزین در یک مسیر ارائه می‌دهد:

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

به طور پیش‌فرض، پوسته (shell) توابع پایگاه داده بلادرنگ (Realtime Database) را با امتیازات ادمین (حساب کاربری سرویس) اجرا می‌کند. از گزینه auth برای اجرای توابع به عنوان یک کاربر نهایی خاص یا به عنوان یک کاربر احراز هویت نشده استفاده کنید:

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

فراخوانی توابع Firestore

هنگام اجرای توابع Firestore به صورت محلی، باید داده‌های آزمایشی مناسب را ارائه دهید. این به طور کلی به معنای ارائه داده‌های آزمایشی جدید برای عملیات onCreate ، داده‌های قدیمی/حذف شده برای عملیات onDelete و هر دو برای توابع onUpdate یا onWrite است. توجه داشته باشید که داده‌های Firestore باید جفت‌های کلید-مقدار باشند؛ به انواع داده‌های پشتیبانی شده مراجعه کنید.

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

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

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

علاوه بر فیلدهای before/after از شیء data ، می‌توانید از فیلدهای params در شیء options برای تقلید از کاراکترهای جایگزین (wildcards) در نام سند استفاده کنید:

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

این پوسته همیشه توابع Firestore را با امتیازات مدیریتی اجرا می‌کند، به این معنی که رویداد ایجاد/به‌روزرسانی/حذف را طوری شبیه‌سازی می‌کند که انگار توسط یک کاربر مدیریتی انجام شده است.

فراخوانی توابع PubSub

برای توابع PubSub، محتوای پیام خود را در یک نمونه Buffer وارد کنید و به صورت اختیاری ویژگی‌های داده را همانطور که نشان داده شده است اضافه کنید:

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

فراخوانی توابع تحلیلی

شما می‌توانید با اجرای myAnalyticsFunction() در پوسته، یک تابع Analytics را بدون هیچ داده‌ای فراخوانی کنید. برای اجرای تابع با داده‌های آزمایشی، توصیه می‌شود یک متغیر برای فیلدهای داده رویداد خاص که تابع شما به آنها نیاز دارد، تعریف کنید:

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);

فراخوانی توابع ذخیره‌سازی و احراز هویت

برای توابع ذخیره‌سازی و احراز هویت، تابع محلی را با داده‌های آزمایشی که می‌خواهید درون تابع مشاهده کنید، فراخوانی کنید. داده‌های آزمایشی شما باید از قالب‌های داده مربوطه پیروی کنند:

فقط فیلدهایی را که کد شما به آنها وابسته است مشخص کنید، یا اگر فقط می‌خواهید تابع اجرا شود، اصلاً هیچ فیلدی را مشخص نکنید.