V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
birdgu
V2EX  ›  React

在 React-Native 项目中使用 Jest 进行单元测试——对官方文档的修正

  •  
  •   birdgu · 2016-07-18 09:14:12 +08:00 · 5415 次点击
    这是一个创建于 3050 天前的主题,其中的信息可能已经有所发展或是发生改变。

    React-Native 当前版本( 0.29 )官方网站上对于使用 jest 进行单元测试的说明 多有错误,依言行之,肯定是做不出来的。在网上搜索良久,关于使用 jest 对 React-Native 进行单元测试的文章也有不少,但是都是针对比较旧的版本,已经过时 了。幸好后来找到 StackOverflow 上 这个问题 下 Abdullah Bakhsh 的回答,才算解决了问题。在此将其答案翻译、整理如下:

    首先是package.json文件其中的jest配置,这部分React-Native官网上的说明是错误的。

      "jest": {
        "scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
        "unmockedModulePathPatterns": [
          "node_modules"
        ],
        "verbose": true,
        "collectCoverage": true
      },
    

    第二步是安装必要的 npm module:

    npm install --save-dev babel-jest
    npm install --save-dev babel-plugin-tranform-regenerator 
    npm install --save-dev babel-preset-react-native
    npm install --save-dev jest-cli
    npm install --save-dev react-addons-test-utils
    npm install --save-dev react-native-mock
    

    第三步创建 .babelrc 文件

    {
        "presets": ["react-native"],
        "plugins": [
            "transform-regenerator"
        ]
    }
    

    第四步创建__mocks__/react-native.js文件:

    module.exports = require('react-native-mock');
    

    最后,jestunmock方法似乎不起作用, Abdullah Bakhsh 给的例子中使用这样的写法:

    const ModuleName = require.requireActual('../module-name).default;
    

    以此来获得未经过 mock 的模块,一般用于获得待测试模块。

    Abdullah Bakhsh 在 git 上有一个演示项目包含了以上所有代码。

    但是,我对于以下这句还有疑问,有待进一步实验:

        "unmockedModulePathPatterns": [
          "node_modules"
        ],
    
    1 条回复    2017-11-05 16:38:39 +08:00
    HyperSimon
        1
    HyperSimon  
       2017-11-05 16:38:39 +08:00
    还没写完吧?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2750 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:53 · PVG 22:53 · LAX 06:53 · JFK 09:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.