用于 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) => 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在vs code开发,提示 “types” 只能在ts中使用的解决方案