1

我有一个应用程序,其中包含一个以编程方式和无头运行 Lighthouse v3 的 Node 脚本(Lighthouse 文档)来测试应用程序的性能。

我为此编写了一些在本地通过的 Jest 测试。测试不是测试 Lighthouse 本身,而是 Node 脚本如何处理从 Lighthouse 返回的结果数据。因此,必须模拟 Lighthouse 依赖项。

在进行测试的过程中,我发现由 Lighthouse 调用的 chrome-launcher 会在我进行 Jest 测试时启动。这意味着我没有正确地嘲笑这种依赖。我认为模拟 Lighthouse 就足够了,并且已经这样做了,但我对如何模拟“thennable”chrome 启动器功能感到困惑。

下面的launchChromeAndRunLighthouse函数来自 Lighthouse Node 文档。

灯塔.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); 
    }); 
  });

Jest 的新手,对如何模拟 chromeLauncher 感到困惑,因此无法启动它。谢谢

4

1 回答 1

0

你不需要模拟 chromeLauncher,让它像它一样工作。仅仅模拟灯塔就足以让测试运行并通过。它在我的项目中按预期工作。

于 2021-02-06T13:18:34.067 回答