Javascript jestjs如何测试使用performance.now()的函数?

Javascript jestjs如何测试使用performance.now()的函数?,javascript,node.js,performance,jestjs,Javascript,Node.js,Performance,Jestjs,我正在为使用performance.now()的ES6类编写jestjs测试。但它似乎不起作用 有没有办法从jest.config.js全局使用perf hook?或者模拟性能并用例如日期覆盖它的方法 我已经尝试用Date覆盖classToTest.js上的性能,但由于导入时已经使用了performance,因此无法工作 简化示例: classToTest.test.js import ClassToTest from "./classToTest"; test("constructor wo

我正在为使用
performance.now()的ES6类编写jestjs测试。但它似乎不起作用

有没有办法从
jest.config.js
全局使用
perf hook
?或者模拟
性能
并用例如
日期
覆盖它的方法

我已经尝试用
Date
覆盖
classToTest.js
上的性能,但由于导入时已经使用了
performance
,因此无法工作

简化示例:

classToTest.test.js

import ClassToTest from "./classToTest";

test("constructor works", () => {
  expect(new ClassToTest()).not.toBeNull();
});
const timer = performance.now();

class ClassToTest {
...
module.exports = {
  setupFilesAfterEnv: [ './setup.js' ]
}
global.performance = require('perf_hooks').performance;
classToTest.js

import ClassToTest from "./classToTest";

test("constructor works", () => {
  expect(new ClassToTest()).not.toBeNull();
});
const timer = performance.now();

class ClassToTest {
...
module.exports = {
  setupFilesAfterEnv: [ './setup.js' ]
}
global.performance = require('perf_hooks').performance;

jest的输出是
ReferenceError:performance未定义

如果您的
jest
测试环境是
jsdom
(默认值),那么它提供了一个类似浏览器的环境,包括
性能。现在将自动定义


如果您的
Jest
测试环境是
节点
,那么您需要提供自己的
性能
全局

可以通过向阵列中添加安装文件来完成此操作:

jest.config.js

import ClassToTest from "./classToTest";

test("constructor works", () => {
  expect(new ClassToTest()).not.toBeNull();
});
const timer = performance.now();

class ClassToTest {
...
module.exports = {
  setupFilesAfterEnv: [ './setup.js' ]
}
global.performance = require('perf_hooks').performance;
…并在定义全局性能的设置文件中:

setup.js

import ClassToTest from "./classToTest";

test("constructor works", () => {
  expect(new ClassToTest()).not.toBeNull();
});
const timer = performance.now();

class ClassToTest {
...
module.exports = {
  setupFilesAfterEnv: [ './setup.js' ]
}
global.performance = require('perf_hooks').performance;

您是否在classToTest.js中导入了
性能
const{performance}=require('perf_hooks')
Yes有效。同时更改为Date.now()也有效。但我希望能够按原样测试源代码并在其环境中运行,而不是使其适应测试环境。对不起,我仍然不明白。让我们暂时忘掉你的考试吧。假设
ClassToTest
代码对我们来说是一个黑匣子,那么它怎么能在不导入它的情况下使用
performance
?谢谢,这正是我想要的!我不得不升级我的jest安装以使其正常工作,似乎SetupFileAfterEnv是一个非常新的添加。很好的回答和解释。它也可以导入到需要的文件中,如
const{performance}=require('perf_hooks')
(不需要安装,因为它是节点的一部分)。