Как внедрить зависимости в Firebase / Google Cloud Functions? (модульное и интеграционное тестирование) - PullRequest
0 голосов
/ 27 марта 2020

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

Допустим, у меня есть функция облака Firebase, написанная на NodeJS:

function.ts

import * as functions from "firebase-functions"
const admin = require("firebase-admin")

import * as authVerifier from "../../auth/authVerifier"

export default functions.https.onRequest(async (req, res) => {
  let authId
  try {
    authId = await authVerifier.identifyClientRequest(req)
  } catch (err) {
    console.error(`Unauthorized request error: ${err}`)
    return res.status(401).send({
      error: "Unauthorized request"
    })
  }
}

Обычно у меня есть интерфейс, и я могу легко смоделировать любой класс, который я хочу проверить.

И, например, authVerifier выглядит так:

authVerifier.ts

import * as express from "express"

export async function identifyClientRequest(req: express.Request) {
  return true // whatever, it doesn't really matter, should be real logic here
}

Я пытаюсь проверить function.ts и я только может передать res и req в него, например:

function.test.ts

it("should verify client identity", async () => {
  const req = {
    method: "PUT"
  }

  const res = { }

  await myFunctions(req as express.Request, res as express.Response)

  // assert that authVerifier.identifyClientRequest(req) called with passed req
})

Так что вопрос: как я могу издеваться authVerifier.identifyClientRequest(req) использовать разные реализации в function.ts и в function.test.ts?

Я действительно не знаю NodeJS / TypeScript, поэтому мне интересно, могу ли я импортировать другой фиктивный класс authVerifier для теста или что-то в этом роде.

1 Ответ

0 голосов
/ 27 марта 2020

Хорошо, похоже, я нашел ответ. Я опубликую это здесь на всякий случай.

Используя sinon js, chai, мы можем заглушить наш класс (в данном случае authVerifier), чтобы получить необходимые результаты:

const chai = require("chai")
const assert = chai.assert
const sinon = require("sinon")

import * as authVerifier from "../../../src/auth/authVerifier"

it("should verify client identity", async () => {
   const req = {
     method: "PUT"
   }

   const res = mocks.createMockResponse()

   const identifyClientRequestStub = sinon.stub(authVerifier, "identifyClientRequest");
   const authVerifierStub = identifyClientRequestStub.resolves("UID")

   await updateUser(req as express.Request, res as express.Response)

   assert.isTrue(authVerifierStub.calledWith(req))
})

И результат:

enter image description here

...