Cloud Functions for Firebase를 TDD로 개발
이른 시간은 30초 정도로 끝납니다만, 늦은 때는 왠지 10분 이상 걸리거나 하고, 1행만 바꾸어 실행 결과를 보고 싶을 때에 몇분 기다리면 좌절합니다.
가능하면 로컬에서 개발하고 정상적으로 움직이는 것을 확인하고 나서 deploy 하고 싶습니다.
로컬에서 함수 실행 | Firebase 에서 함수를 에뮬레이트 할 수 있지만 명령 줄에서 JSON을 준비하는 것은 어렵지만 TDD에서 개발할 수 있다면 그렇지 않습니다.
그래서 Cloud Functions 를 로컬에서 테스트할 수 있게 해봤습니다. (아직 Cloud Firestore 트리거만 테스트할 수 있음)
starhoshi/rescue-fire: A test helper for Cloud Functions.
어떻게 할까
Cloud Firestore 트리거로 이동하는 Cloud Functions는
event
라는 변수로 시작합니다.exports.updateUser = functions.firestore.document('users/{userId}')
.onCreate(event => {
console.log('old name', event.data.data().name)
return event.data.ref.update({name: 'new name'})
})
이
event
를 만들 수 있다면 Admin SDK을 사용하여 Cloud Functions와 거의 동일한 코드를 실행할 수 있습니다.rescue-fire 는 이
event
를 만들어 줍니다.TDD로 Cloud Functions 개발하기
rescue-fire를 사용하여 TDD로 개발해 봅시다. 이 샘플에서는 TypeScript를 사용하고 있습니다.
1. 설치
yarn add --dev rescue-fire typescript
2. 구성 파일 JSON 얻기
서버에 Firebase Admin SDK 추가하기 | Firebase을보고 JSON을 다운로드하십시오.
중요: 이 파일에는 서비스 계정의 개인 암호 키와 같은 중요한 정보가 들어 있습니다. 비공개 키의 정보는 기밀로 취급하고 공개 리포지토리에 저장하지 마십시오.
3. 테스트 라이브러리
여기서는 jest를 사용하고 있지만 좋아하는 것을 사용하는 것이 좋습니다.
yarn add --dev jest ts-jest
3. 테스트 작성
User 가 작성되면 name 을 update 하는 함수를 만들기로 했습니다.
함수의 내용은 이렇게 되네요.
const changeName = (event: functions.Event<DeltaDocumentSnapshot>) => {
console.log('old name', event.data.data().name)
return event.data.ref.update({ name: 'new name' })
}
이 코드를 테스트하면 다음과 같습니다.
import 'jest'
import * as admin from 'firebase-admin'
import * as functions from 'firebase-functions'
import * as Rescue from 'rescue-fire'
// Admin SDK を使うための初期セットアップ
beforeAll(() => {
const serviceAccount = require('./your-firebase-adminsdk.json')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
})
})
test('update name', async () => {
// テストデータの準備
const data = {name: 'name'}
const user = await admin.firestore().collection('user').add(data)
const event = Rescue.event(user, data) // イベントを作成
// Cloud Functions を発火
await changeName(event)
// アップデートされたユーザを取得し、 name が変更されていることを確認
const updatedUser = await admin.firestore().collection('user').doc(user.id).get()
expect(updatedUser.data()!.name).toBe('new name')
})
명확하게하기 위해 먼저 구현을 작성했기 때문에 엄격하게 TDD는 아니지만 로컬에서 Cloud Functions를 의사 적으로 움직여 테스트를 작성할 수있었습니다.
이것은 작은 함수이지만, orderable.test.ts 에서는 보다 거대한 함수가 rescue-fire 를 사용해 테스트되고 있습니다.
Optional 인수
event.params, event.data.previous.data() 등을 필요에 따라 인수로 설정할 수 있도록 하고 있습니다.
어떤 식으로 전달할 수 있는지는 index.d.ts을 참고하십시오.
4. 마지막으로 deploy
그럼 마지막으로 deploy하자. 방금 만든 changeName(event)
를 함수에 넘겨주면 됩니다.
exports.updateUser = functions.firestore
.document('users/{userId}')
.onCreate(event => {
return changeName(event)
})
주의사항
완전히 이벤트를 에뮬레이트하지는 않으므로 일부 동작에 문제가 발생할 수 있습니다.
이미 Cloud Functions를 배포한 상태라면 Cloud Functions가 점화와 로컬 테스트를 동시에 실행하게 되므로 테스트하기 전에 Cloud Functions를 지워야 합니다. (이것은 어떻게든하고 싶다)
또한 Firestore에 쓰는 것을 Mock하는 것은 아니므로 실행 시간이 길고 예기치 않은 오류가 발생할 수 있습니다. 그러나, 서투른 Mock 하는 것보다 그대로 두드리는 것이 테스트로서는 좋다고 생각하고 있습니다.
끝
rescue-fire를 사용하면 로컬에서 Cloud Functions 테스트를 작성하면서 개발할 수 있습니다.
Cloud Functions를 편안하게 개발합시다
starhoshi/rescue-fire: A test helper for Cloud Functions.
Reference
이 문제에 관하여(Cloud Functions for Firebase를 TDD로 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/star__hoshi/items/572193910542be1863af
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
yarn add --dev rescue-fire typescript
yarn add --dev jest ts-jest
const changeName = (event: functions.Event<DeltaDocumentSnapshot>) => {
console.log('old name', event.data.data().name)
return event.data.ref.update({ name: 'new name' })
}
import 'jest'
import * as admin from 'firebase-admin'
import * as functions from 'firebase-functions'
import * as Rescue from 'rescue-fire'
// Admin SDK を使うための初期セットアップ
beforeAll(() => {
const serviceAccount = require('./your-firebase-adminsdk.json')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
})
})
test('update name', async () => {
// テストデータの準備
const data = {name: 'name'}
const user = await admin.firestore().collection('user').add(data)
const event = Rescue.event(user, data) // イベントを作成
// Cloud Functions を発火
await changeName(event)
// アップデートされたユーザを取得し、 name が変更されていることを確認
const updatedUser = await admin.firestore().collection('user').doc(user.id).get()
expect(updatedUser.data()!.name).toBe('new name')
})
exports.updateUser = functions.firestore
.document('users/{userId}')
.onCreate(event => {
return changeName(event)
})
완전히 이벤트를 에뮬레이트하지는 않으므로 일부 동작에 문제가 발생할 수 있습니다.
이미 Cloud Functions를 배포한 상태라면 Cloud Functions가 점화와 로컬 테스트를 동시에 실행하게 되므로 테스트하기 전에 Cloud Functions를 지워야 합니다. (이것은 어떻게든하고 싶다)
또한 Firestore에 쓰는 것을 Mock하는 것은 아니므로 실행 시간이 길고 예기치 않은 오류가 발생할 수 있습니다. 그러나, 서투른 Mock 하는 것보다 그대로 두드리는 것이 테스트로서는 좋다고 생각하고 있습니다.
끝
rescue-fire를 사용하면 로컬에서 Cloud Functions 테스트를 작성하면서 개발할 수 있습니다.
Cloud Functions를 편안하게 개발합시다
starhoshi/rescue-fire: A test helper for Cloud Functions.
Reference
이 문제에 관하여(Cloud Functions for Firebase를 TDD로 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/star__hoshi/items/572193910542be1863af
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Cloud Functions for Firebase를 TDD로 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/star__hoshi/items/572193910542be1863af텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)