使用Jest进行运行单元测试时,window.crypto API引起问题。我还没有找到一种在不安装其他软件包的情况下将加密合并到Jest中的方法,这是我做不到的。因此,无需使用其他npm软件包,便可以测试使用以下功能的函数:crypto.getRandomValues()
不会使Jest崩溃?任何链接,建议或技巧都会受到赞赏
答案 0 :(得分:4)
就像@RwwL一样,接受的答案对我不起作用。我发现该库中使用的polyfill确实起作用:commit with polyfill
//setupTests.tsx
const nodeCrypto = require('crypto');
window.crypto = {
getRandomValues: function (buffer) {
return nodeCrypto.randomFillSync(buffer);
}
};
//jest.config.js
module.exports = {
//...
setupFilesAfterEnv: ["<rootDir>/src/setupTests.tsx"],
};
答案 1 :(得分:3)
这应该做到。使用以下代码全局设置crypto
属性。这将允许Jest访问window.crypto
,并且不会造成任何问题。
const crypto = require('crypto');
Object.defineProperty(global.self, 'crypto', {
value: {
getRandomValues: arr => crypto.randomBytes(arr.length),
},
});
答案 2 :(得分:1)
为您的笑话环境添加crypto
全局,就像在浏览器中一样。
您的jest.config.js应该如下所示:
const {defaults} = require('jest-config');
module.exports = {
globals: {
...defaults.globals,
crypto: require('crypto')
}
};
答案 3 :(得分:1)
对于nodeJS +打字稿,只需使用global
而不是global.self
import crypto from 'crypto'
Object.defineProperty(global, 'crypto', {
value: {
getRandomValues: (arr:any) => crypto.randomBytes(arr.length)
}
});
答案 4 :(得分:1)
在Angular 8中,我使用uuid生成器对lib进行Jest测试时遇到了这个问题。在开玩笑的测试设置中,我对此进行了模拟:
Object.defineProperty(global.self, 'crypto', {
value: {
getRandomValues: arr => arr
},
});
答案 5 :(得分:1)
const crypto = require('crypto');
global.crypto = crypto;
答案 6 :(得分:1)
从 node 15.x 开始,您可以使用 crypto.webcrypto
例如
import crypto from "crypto";
Object.defineProperty(global.self, "crypto", {
value: {
subtle: crypto.webcrypto.subtle,
},
});
答案 7 :(得分:1)
源自 AIVeligs 答案:
因为我在 Jest 中使用了“node”环境,所以我不得不使用
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
globals: {
crypto: {
getRandomValues: (arr) => require("crypto").randomBytes(arr.length),
},
},
};
答案 8 :(得分:1)
我正在使用 vue-jest,对我有用的是 jest.config.js
文件中的以下配置:
module.exports = {
...
setupFiles: [
'<rootDir>/tests/settings/jest.crypto-setup.js',
],
};
并在jest.crypto-setup.js
中:
global.crypto = {
getRandomValues: (arr) => require('crypto').randomBytes(arr.length)
};
直接在 getRandomValues
中添加 module.exports
函数定义不起作用,因为 globals
对象必须是 json-serializable(如此处指定:https://jestjs.io/docs/configuration#globals-object)。