elimey
elimey

Reputation: 45

spyOn @react-native-firebase/analytics methods

Basically, I want to make sure the methods of analytics are called with certain properties but so far it is not working:

Cannot spy the logAppOpen property because it is not a function; undefined given instead

the library is successfully mocked since I can see console log out of my jest.fn():

  jest.mock('@react-native-firebase/analytics', () => {
    return () => ({
      logAppOpen: jest.fn(() => console.log('mocked fun called')), //===>shown correctly
    })
  })

My class is:

import analytics from '@react-native-firebase/analytics';

export default class GA {
  appStarted = async () =>{
    console.log('appStarted called'); //==> showing
    await analytics().logAppOpen();
  }
}

my test:

it("should log app starting", async () =>{
    const spy = jest.spyOn(analytics, 'logAppOpen') //===>FAILS HERE
    congst ga = new GA();
    await ga.appStarted();
    expect(spy).toHaveBeenCalled();
})

but in my test: console.log(analytics) does show an empty object {}

Upvotes: 1

Views: 720

Answers (1)

Estus Flask
Estus Flask

Reputation: 222989

It's analytics().logAppOpen() while jest.spyOn tries to spy on analytics.logAppOpen which doesn't exist.

For lazily evaluated spied functions it's easier to expose them as variables:

const mockLogAppOpen = jest.fn();

jest.mock('@react-native-firebase/analytics', () => {
  return jest.fn()
  .mockReturnValue({ logAppOpen: mockLogAppOpen });
});

This way it can be accessed for call assertions. There's no need for jest.spyOn for a function that is already a spy.

Upvotes: 2

Related Questions