我想为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;
}
这是解决这个问题的正确方法吗?如果是,我如何导入/要求以使其有效?如果不是,最好的方法是什么?
答案 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>
因此,在测试环境中将运行模拟模块,并且在应用程序环境中,您将拥有实际的节点模块。