1
votes

I have an application that includes a Node script that runs Lighthouse v3 programatically and headlessly (Lighthouse documentation) to test the application's performance.

I wrote some Jest tests for this which pass locally. The tests are not testing Lighthouse itself, but rather how the Node script deals with with the results data returned from Lighthouse. Therefore, the Lighthouse dependency must be mocked.

In the course of doing my testing I have discovered that chrome-launcher, which is invoked by Lighthouse, launches when I'm doing my Jest test. This means I am not mocking this dependency correctly. I thought it was enough to mock Lighthouse and have done so but I am confused about how I can mock the 'thennable' chrome launcher function function.

The launchChromeAndRunLighthouse function below is from the Lighthouse Node documentation.

lighthouse.js

    const lighthouse = require('lighthouse'); 
    const chromeLauncher = require('chrome-launcher');  

    function launchChromeAndRunLighthouse(url, opts, lConfig = null) {  
      return chromeLauncher 
        .launch({ chromeFlags: opts.chromeFlags })  
        .then(chrome => {   
          const options = { ...opts, port: chrome.port };   
          return lighthouse(url, options, lConfig).then(results =>  
            chrome.kill().then(() => results.lhr),  
          );    
        }); 
    }

    function myFunc(config) {
      launchChromeAndRunLighthouse(myAppUrl, config);
      // manipulates data returned from launchChromeAndRunLighthouse
      return true;
    }

    module.exports = myFunc;

lighthouse.test.js

    import myFunc from './lighthouse';  

    jest.mock('lighthouse', () =>   
      jest.fn().mockResolvedValue({ 
        lhr: {  
          categories: { 
            performance: {  
              id: 'performance',    
              score: 1, 
            }
          },    
        },  
      }),   
    );  

  // chromeLauncher actually gets invoked by this
  describe('myfunc', () => {    
    it('tests myfunc', async () => {    
      const result = await myFunc(config);  
      expect(result).toEqual(true); 
    }); 
  });

New to Jest and confused at how I can mock chromeLauncher so it's prevented from launching. Thanks

1

1 Answers

0
votes

You don't need to mock chromeLauncher, leave it work like it does. Just mocking lighthouse is enough to make tests run and pass. It works as expected in my projects.