Тестирование функций Firebase выдает ошибку «Ошибка типа: невозможно прочитать свойство« отправить »из неопределенного» - PullRequest
0 голосов
/ 15 января 2020

Я использую Мокко для проверки своих функций. Они работают как при развертывании в Firebase, так и при локальном запуске с эмулятором.

Моя проблема заключается в том, что я продолжаю получать эту ошибку, указывающую на саму функцию:

function:getTags:error:  TypeError: Cannot read property 'send' of undefined
    at /Users/garrettlove/development/projects/cirrcl/crcle_backend/functions/categories/tags/getTags.js:24:7
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:76616) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'send' of undefined
    at /Users/garrettlove/development/projects/cirrcl/crcle_backend/functions/categories/tags/getTags.js:28:7
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:76616) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:76616) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

И тогда Я получаю эту ошибку, указывающую на мой тест:

test:getTags:error:  TypeError: Cannot read property 'should' of undefined
    at Context.<anonymous> (/Users/garrettlove/development/projects/cirrcl/crcle_backend/functions/test/index.test.js:17:11)

Вот мой код функции:

const functions = require('firebase-functions')
const mongoose = require('mongoose')
const Tag = require('../../models/tag')

const uri = 'MongoDB URL'

module.exports = functions.https.onRequest(async (req, res) => {
    try {
        await mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true })
        const result = await Tag.find({})
        res.send({ message: 'Request fulfilled', success: true, result: result })
    } catch (err) {
        console.log('function:getTags:error: ', err)
        res.send({ message: 'Unable to fulfill the request', success: false, error: err })
    }
})

Наконец, вот мой код теста:

const admin = require('firebase-admin')
const serviceAccount = require('../../../../../keys/cirrcl-firebase.json');
const getTags = require('../categories/tags/getTags')

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "DB URL"
  });

describe('Describe something here', () => {
    it('Should succeed or fail', async () => {
        try {
            const result = await getTags()
            console.log('getTags test result: ', result)
            result.should.have.status(200)
        } catch (err) {
            console.log('test:getTags:error: ', err)
            // err.should.throw()
        }
    })
})

Единственное, что я могу подумать о проблеме с учетными данными, но это не совсем имеет смысла, так как у меня есть сертификат (я также пробовал без него, а также с сертификатом движка приложения, который, как говорят некоторые документы) Кроме того, так как я могу запустить это локально, что я и думал, что мокко все равно делал, я немного запутался

1 Ответ

0 голосов
/ 17 января 2020

Первая ошибка связана с вызовом getTags без параметров. Я воспроизвел это в узле следующим образом:

test. js:

const functions = require('firebase-functions')

module.exports = functions.https.onRequest((req, res) => {
        res.send()
})

test2. js:

const test = require("./test.js");
const result = test();
console.log(result);

Чем при запуске: node test2.js вы получите ту же ошибку.

В качестве разрешения я нашел пример теста здесь . Это ссылка на Google Cloud Function, аналогичная Firebase. И я использовал тот же подход и создал параметры запроса и ответа. После изменений test2. js выглядел так:

const test = require("./test.js");
const req = { body: {  name: 'name' }  };
const res = {send: () => console.log("test2")};
test(req, res);

Теперь, если вы снова запустите: node test2.js, вы не получите никаких ошибок. Поэтому я полагаю, вам следует добавить параметры к вашему вызову getTags.

Когда дело доходит до 2-й ошибки. Функция onRequest не возвращает никакого значения, поэтому переменная result всегда будет undefined. Как вы видите, запустив мой пример, он будет использовать функцию res.send, которая отправляет ответ. Я не знаю мокко достаточно хорошо, чтобы помочь вам с тестированием, но, пожалуйста, проверьте ссылку, которую я передал выше для аналогичного теста.

Надеюсь, это поможет вам разобраться ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...