React Native中的非组件单元测试

时间:2017-12-31 12:48:31

标签: unit-testing react-native

我想为React Native / TypeScript应用编写一些单元测试。问题是某些库不在开发环境下运行,如'AsyncStorage'或'react-native-sqlite-2'。

我在Jest网站上发现的唯一一件事就是嘲笑,但这只是一种解耦UI测试的方法。

我在考虑使用一些node.js库来模拟这些库,根据环境加载正确的库。

类似的东西:

if(isDevelopment) {
    SQLiteDatabase = require("./sqlite_database_node").SQLiteDatabaseNode;
}
else {
    SQLiteDatabase = require("./sqlite_database_rn").SQLiteDatabaseRN;
}

这是解决这个问题的正确方法吗?如果是,我如何导入/要求以使其有效?如果不是,最好的方法是什么?

1 个答案:

答案 0 :(得分:4)

运行Jest或任何单元测试时。测试在节点环境中运行。 因此,当您尝试访问具有本机组件/库的模块(例如:Async Storage或SQLite)时,代码将在测试环境中中断。

为了解决这个问题,Jest提出了模块模拟。 所以我在我的项目中做的是对于我使用的任何node_module,它在内部使用本机模块。我为它创建一个全局模拟。

要做到这一点,您只需在根目录上创建一个文件夹. ├── README.md ├── __mocks__ │   ├── base-64.js │   ├── react-native-animatable.js │   ├── react-native-config.js │   ├── react-native-device-info.js │   ├── react-native-fetch-blob.js │   ├── react-native-firebase.js │   ├── react-native-google-analytics-bridge.js │   ├── react-native-map-markerclustering.js │   ├── react-native-maps.js │   ├── react-native-simple-download-manager.js │   ├── react-native-simple-toast.js │   ├── react-native-splash-screen.js │   ├── react-native-testfairy.js │   ├── react-native-version-number.js │   └── react-native.js ├── __tests__ │   └── index.test.js ├── app │   ├── App.container.js │   ├── __tests__ │   ├── assets │   ├── components │   ├── config │   ├── index.js │   ├── language │   ├── pages │   ├── redux │   ├── routes │   ├── themes │   └── utils ├── app.json ├── circle.yml ├── index.js ├── package.json └── yarn.lock ,如此

__mocks__/react-native-firebase.js

作为一个例子,让我们看看

module.exports = { crash: () => ({ setCrashCollectionEnabled: jest.fn() }), auth: () => ({ signInAnonymously: jest.fn() }), database: () => ({ ref: () => ({ on: jest.fn() }) }), config: () => ({ fetch: jest.fn(), setDefaults: jest.fn(), getValue: jest.fn() }), messaging: jest.fn(() => ({ requestPermissions: jest.fn(), subscribeToTopic: jest.fn(), getToken: jest.fn(Promise.resolve), onMessage: jest.fn(), getInitialNotification: jest.fn(Promise.resolve), onTokenRefresh: jest.fn() })) };

__mocks__/react-native-device-info

或者您可能 const mockmod = jest.genMockFromModule('react-native-device-info'); module.exports = mockmod;

require('react-native-device-info')

重点是......在测试期间,当你做 <script> function myFunction(month,year) { monthdays=getDaysInMonth(month,year); var days=''; start=0; while(monthdays!=0){ days+= "<option value="+start+">"+start+"</option>"; monthdays--; } jQuery("#daysSelect").html(days); } </script> <?php $year=date('Y'); ?> <select id="mySelect" name="month" onChange="myFunction(this.value,'<?php echo $year; ?>')"> <option value="1">January</option> <option value="2">February</option> <option value="3">March</option> <option value="4">April</option> <option value="5">May</option> <option value="6">June</option> <option value="7">July</option> <option value="8">August</option> <option value="9">September</option> <option value="10">October</option> <option value="11">November</option> <option value="12">December</option> </select>

时,env jest会自动使用这些文件

因此,在测试环境中将运行模拟模块,并且在应用程序环境中,您将拥有实际的节点模块。