87

Hi I am trying to unit test while developing a simple web with AngularJS + Firebase, but I have a problem defining the spec and trying the test runner

myProject/test/spec/main.js :

describe('Controller: MainCtrl', function() {

var MainCtrl, scope

beforeEach(module('MainApp'));

beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl', {
        $scope: scope
    })
}));

it('should....',function(){
    expect(true).toBe(true)
})
it('should2....',function(){
    expect(false).toBe(false)
})
});

result:

PhantomJS 2.1.1 (Mac OS X 0.0.0) Controller: MainCtrl should.... FAILED
Error: [$injector:modulerr] Failed to instantiate module MainApp due 
to: Firebase: Firebase App named '[DEFAULT]' already exists 
(app/duplicateapp).

However, defining the spec once is not a problem. For example:

it('should....',function(){
   expect(true).toBe(true)
})

I do not know why this is the reason I give a hint to me

Here is the project I am developing.

https://github.com/parkwookyun/firebase-angular-board

parkwookyun
  • 977
  • 1
  • 6
  • 9

8 Answers8

225
if (!firebase.apps.length) {
   firebase.initializeApp({});
}else {
   firebase.app(); // if already initialized, use that one
}

Similar answer here

Waleed93
  • 616
  • 8
  • 16
Isaac Sekamatte
  • 4,134
  • 1
  • 25
  • 34
15

I had the same issue using firebase, and I discover that I was initializing the firebase twice, example:

function initializeFirebase(){    
 var config = {
    apiKey: "myApiKey",
    authDomain: "myAuthDomain",
    databaseURL: "myDatabaseUrl",
    storageBucket: "myStorageBocket",
    messagingSenderId: "idhere"   
   };   
   //initialize firebase  
   firebase.initializeApp(config);  
}

In my case I was using react, And I was calling initializeFirebase() from two different components, but I've decided to call it from the parent component. And now I'm able to query my database, insert records, remove, etc.

Hope this helps someone

Erick Garcia
  • 271
  • 2
  • 8
4

i only glanced at your github repo to see that there is more .js files than suggested in your question. i had 2 separate .js files. both being included on the same html page that were both configuring and initializing the default app when it only needed to be done once for that page i believe. what worked for me was to comment out the second "initializeApp()" and i no longer got that error. try to look for the below in your .js and comment out or delete one of the initializations.

var config = { apiKey: "my api key", authDomain: "something.firebaseapp.com", databaseURL: "https://somesite.firebaseio.com", projectId: "myProjectId", storageBucket: "somesite.appspot.com", messagingSenderId: "someIntegers" }; //firebase.initializeApp(config);

Duan Walker
  • 187
  • 10
  • config is just an object in this example. it does not do anything automatically. you have to bind it to firebase package. If it is defined once then the function / component in which it is being called is rendering twice. just make a check as mentioned by Isaac – imran haider Feb 04 '21 at 07:36
1

In my case, I was not explicitly calling initializeApp() more than once, so I was still confused after reading the main answers. Turns out that if you use Firebase hosting, then initialization is called automatically through SDK auto-configuration, i.e. when you have this line in index.html:<script src="/__/firebase/init.js"></script> you don't need to call initializeApp(config).

"When you deploy to Firebase or test your app locally, this script automatically configures the Firebase JavaScript SDK for the active Firebase project and initializes the SDK." SDK auto-configuration

brownmagik352
  • 308
  • 2
  • 11
1

This error occurs simply because you are trying to initialize firebase multiple times into your project.

  • If using two firebase instances in your application without specifying a name Firebase will give both the name DEFAULT, which creates the conflict. To ensure the instances remain unique you can pass a name to the function: ```firebase.initializeApp({}, 'your app name here')``` – Yoofi Brown-Pobee Mar 09 '21 at 16:41
0

I recently solved this issue in my own code. My issue was caused by accidentally linking my javascript file, which calls initializeApp(), in the head and in the body of my html file. My fix was to delete the duplicate javascript tag in the head of my html file so only one existed in the body.

Scan through your code to make sure you only call initializeApp() once. This includes any js files that might be calling the method or duplicating the js file in your html file.

kendra
  • 11
0

I have had the same problem

if you are using ES6 modules and you installed firebase by npm you can not put init scrips into index.html

it is duplications of firebase dependancies

Juraj
  • 232
  • 2
  • 5
0

Check if project is in admin.apps. If it is, use if not initialize it. This will prevent the error from occurring.

const projectFbData = admin.apps.find((item) => item.name_ === projectId) || admin.initializeApp(config, projectId)

Jeremy Tenjo
  • 251
  • 2
  • 7
  • Code-only answers may solve the problem, but an explanation will help other users understand why. – Nick Sep 20 '20 at 17:38