我已开始使用新的firebase-functions-test测试SDK对我的 Cloud Firestore 功能进行单元测试。当我通过npm test
运行我的测试时,我收到以下错误:
The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services
我的方法与quickstarts samples中的makeUppercase
方法非常相似,因此我主要从test.js文件中复制了测试。
describe('updateActiveNotesCount', () => {
// Test Case: Setting environments/{environment}/users/{userId}/people/{personId}/notes/{noteId}/isActive to 'true' should cause
// .../{personId}/activeNotesCount to be incremented
it('Should increment active notes count on the person field', () => {
// [START assertOffline]
const childParam = 'activeNotesCount'; // The field to set
const setParam = '1'; // the new activeNotesCount
const childStub = sinon.stub();
const setStub = sinon.stub();
// A fake snap to trigger the function
const snap = {
// I believe this represents event params, wildcards in my case
params: {
userId: () => '1',
personId: () => '2',
environment: () => 'dev',
},
// Not ENTIRELY sure how to write this one out
ref: {
parent: {
child: childStub
}
}
};
childStub.withArgs(childParam).returns({ set: setStub });
setStub.withArgs(setParam).returns(true);
const wrapped = test.wrap(myFunctions.updateActiveNotesCount);
return assert.equal(wrapped(snap), true);
// [END assertOffline]
})
});
我无法移除此错误。
修改
我看到他们现在更新了文档以包含新的SDK,他们提到配置值必须被模拟。在我的index.js
中,我使用了:
const config = functions.config().firebase
admin.initializeApp(config);
我现在试着像这样嘲笑它:
before(() => {
// [START stubAdminInit]
test.mockConfig({ firebase: 'FakeId' });
adminInitStub = sinon.stub(admin, 'initializeApp');
myFunctions = require('../index');
// [END stubAdminInit]
});
但没有运气。
结束修改
对此有任何帮助将不胜感激。
答案 0 :(得分:1)
我遇到了同样的问题,无论我如何尝试,都无法对initializeApp进行存根处理。我发现的解决方法是在TEST文件的开头调用\*
。
因此,不要对admin.initializeApp(functions.config().firebase);
和config
和firebase
进行存根处理,只需执行以下操作:
initializeApp
答案 1 :(得分:0)
https://github.com/firebase/firebase-functions-test/issues/38
我的解决方案...
// IMPORTS
const chai = require('chai');
const assert = chai.assert;
const sinon = require('sinon');
const admin = require('firebase-admin');
const test = require('firebase-functions-test')();
// TESTS
describe('Cloud Functions', () => {
let myFunctions, adminInitStub;
before(() => {
// ORDER REQUIRED
// 1) Calling 'exampleDocumentSnapshot' only way to initialize testing app
test.firestore.exampleDocumentSnapshot()
// 2) Prevents multiple initializeApp calls
adminInitStub = sinon.stub(admin, 'initializeApp');
// 3) Import functions
myFunctions = require('../');
});
答案 2 :(得分:0)
这对我有用:
关键点:您必须在测试框架中显式初始化应用程序,然后将其存根
const chai = require('chai');
const assert = chai.assert;
const sinon = require('sinon');
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const test = require('firebase-functions-test')();
describe('Functions', () => {
let _fns, adminInitStub;
before(() => {
test.mockConfig({ YOUR_CONFIG });
admin.initializeApp(functions.config().firebase);
adminInitStub = sinon.stub(admin, "initializeApp");
_fns = require('../index');
});
after(() => {
test.cleanup();
});
describe('when test case blah', () => {
// Test Case: setting messages/{pushId}/original to 'input' should cause 'INPUT' to be written to
// messages/{pushId}/uppercase
it('should do xyz', () => {
assert(1 + 1, 2);
});
});
});