用于 react-native 的 Code Push 打破玩笑测试

Posted

技术标签:

【中文标题】用于 react-native 的 Code Push 打破玩笑测试【英文标题】:Code Push breaking jest tests for react-native 【发布时间】:2017-08-20 01:45:46 【问题描述】:

我已经为代码推送配置了一个应用程序,它运行良好,除了开玩笑测试。此错误无法渲染应用程序:

TypeError: Cannot read property 'CheckFrequency' of undefined

  at Object.<anonymous> (app/index.js:7:66)
  at Object.<anonymous> (index.ios.js:5:12)
  at Object.<anonymous> (__tests__/index.ios.js:4:12)

在这一行:

const codePushOptions =  checkFrequency: codePush.CheckFrequency.MANUAL ;

测试代码为:

import App from '../index.ios';

it('renders correctly', () => 
  const tree = renderer.create(
      <App />,
  );
);

【问题讨论】:

你需要为 CodePush 创建一个mock codePush 变量未定义或不是 json' @Assem Chelli 您解决了您的问题吗?我自己也遇到了类似的事情...... @TomHall 还没有 你明白了吗?我也遇到了这个。 【参考方案1】:

我在将 codePush 集成到我目前正在开发的 React Native 应用程序中时遇到了这个问题。对我有用的是:

    创建文件__mocks__/react-native-code-push.js

添加以下代码:

const codePush = 
  InstallMode: ON_NEXT_RESTART: 'ON_APP_RESTART',
  CheckFrequency: ON_APP_RESUME: 'ON_APP_RESUME'
;

const cb = _ => app => app;
Object.assign(cb, codePush);
export default cb;

在我的index.js 文件中,我有:

import codePush from 'react-native-code-push';
import MyApp from './src/'

const codePushOptions = 
  installMode: codePush.InstallMode.ON_NEXT_RESTART,
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME
;

export default codePush(codePushOptions)(MyApp);

【讨论】:

luizParreira,你在哪里创建了__mocks__ 目录?您必须将其链接到任何地方吗? 在根目录下创建了__mocks__ 目录。 facebook.github.io/jest/docs/en/manual-mocks.html【参考方案2】:

类似于Tom Hall 的描述,这个模拟确实对我有用:

jest.mock('react-native-code-push', () => 
  const cp = (_: any) => (app: any) => app;
  Object.assign(cp, 
    InstallMode: ,
    CheckFrequency: ,
    SyncStatus: ,
    UpdateState: ,
    DeploymentStatus: ,
    DEFAULT_UPDATE_DIALOG: ,

    checkForUpdate: jest.fn(),
    codePushify: jest.fn(),
    getConfiguration: jest.fn(),
    getCurrentPackage: jest.fn(),
    getUpdateMetadata: jest.fn(),
    log: jest.fn(),
    notifyAppReady: jest.fn(),
    notifyApplicationReady: jest.fn(),
    sync: jest.fn(),
  );
  return cp;
);

【讨论】:

为什么要柯里化?它不会像那样过去。修改为const cp = (app: any) =&gt; app;后通过。【参考方案3】:

在您的测试中,在您的 import App from '../index.ios'; 下方,添加以下内容:

jest.mock('react-native-code-push', () => 
    return jest.fn(() => (
        InstallMode: jest.fn(),
        CheckFrequency: jest.fn(),
        CodePushComponent: jest.fn(),
        codePushify: jest.fn()
    ));
);

【讨论】:

我相信这仍然会导致错误TypeError: Cannot read property 'MANUAL' of undefined【参考方案4】:

您需要一个模拟 code-push 才能工作,这条线 CodePush.CheckFrequency.MANUAL 将始终生成 null

【讨论】:

以上是关于用于 react-native 的 Code Push 打破玩笑测试的主要内容,如果未能解决你的问题,请参考以下文章

React-Native Code-Push流程梳理

React-Native在vs code开发,提示 “types” 只能在ts中使用的解决方案

react-native的相关插件集合

将 react-spring 用于 react-native

react-native 微信登录功能

将下载的声音用于推送通知(react-native)