javascriptunit-testingjestjsmockingoptimizely

How to mock optimizelySDK.createInstance().onReady() using Jest?


Here is my mock file __mocks__/@optimizely/optimizely-sdk.js

const optimizelySDK = jest.requireActual('@optimizely/optimizely-sdk')

optimizelySDK.createInstance().onReady = () => ({ success: false }))

module.exports = optimizelySDK

Here is my test file Optimizely.test.js

import optimizelySDK from '@optimizely/optimizely-sdk'

test('onReady', () => {
  const response = optimizelySDK.createInstance().onReady()
  expect(response).toBe({ success: false })
})

I think I might be going about this all wrong. This worked perfectly when I try this with lodash. I believe this is because optimizelySDK is a class. I think I should be mocking that instead. How do I successfully mock and test optimizelySDK?


Solution

  • For anyone who came across this on Google, I had the same problem and got it working with jest:

    jest.mock('@optimizely/optimizely-sdk', () => ({
      ...jest.requireActual('@optimizely/optimizely-sdk'),
      createInstance: () => ({
        getEnabledFeatures: jest.fn().mockReturnValueOnce(['featureA', 'featureB']),
        onReady: jest.fn().mockResolvedValueOnce({ status: 200 })
      })
    }))
    
    describe('my-test', () => {
    
      it('should pass', async () => {
    
        const result = await getFeatures()
    
        console.log(result) // ['featureA', 'featureB']
    
        // assert on result here
      });
    });
    

    where my code looked something like:

    const getFeatures = async (event) => {
    
      try {
        const optimizelyInstance = optimizelySDK.createInstance({
          sdkKey: process.env.OPTIMIZLEY_SDK_KEY,
        });
    
        const optimizelyParameters = {}
    
        return optimizelyInstance.onReady().then(() => {
          const result = optimizelyInstance.getEnabledFeatures('id', optimizelyParameters);
    
          return result;
        });
      } catch (err) {
        console.error('Could not get features', err);
      }
    };