如何使用Jest使用crypto或window.msCrypto测试功能

时间:2018-10-02 15:58:29

标签: javascript reactjs jestjs window.crypto

使用Jest进行运行单元测试时,window.crypto API引起问题。我还没有找到一种在不安装其他软件包的情况下将加密合并到Jest中的方法,这是我做不到的。因此,无需使用其他npm软件包,便可以测试使用以下功能的函数:crypto.getRandomValues()不会使Jest崩溃?任何链接,建议或技巧都会受到赞赏

9 个答案:

答案 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')
  }
};

参考:https://jestjs.io/docs/en/configuration#globals-object

答案 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)。