我制作了一个精简版的项目,它有一个简单的按钮,按下后会打开日期选择器。如果用户选择了一个日期,则文本标签将被更新。datePicker的onChange函数调用另一个函数。我如何从jest与datePicker交互,即更改值并测试标签是否更新?
这是我的应用程序:
import React from 'react';
import {useState} from "react"
import { Platform, Button, Text, View} from 'react-native';
import DateTimePicker from '@react-native-community/datetimepicker';
const App = () => {
const [date, setDate] = useState(new Date());
const [mode, setMode] = useState('date');
const [show, setShow] = useState(false);
const onChange = (event, selectedDate) => {
const currentDate = selectedDate;
setShow(false);
setDate(currentDate);
testFunction()
};
const showMode = (currentMode) => {
if (Platform.OS === 'android') {
setShow(true);
}
setMode(currentMode);
};
const showDatepicker = () => {
showMode(mode);
};
function testFunction(){
console.log("testFunction called")
}
return (
<View style={{
flex: 1,
justifyContent: "center",
alignItems: "center"
}}>
<Button style={{margin:50}} onPress={showDatepicker} title="Show date picker!" />
<Text>selected: {date.toLocaleString()}</Text>
{show && (
<DateTimePicker
testID="dateTimePicker"
value={date}
mode={mode}
is24Hour={true}
onChange={onChange}
/>
)}
</View>
);
};
export default App;
这是我的测试
import React from 'react';
import renderer from 'react-test-renderer';
import {fireEvent, render, screen, waitFor, userEvent} from '@testing-library/react-native';
import App from "../app"
jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper')
describe('Date Picker Tests', () => {
it.only("changing the date of datepicker", async() => {
let journal = render(<App/>)
let text = screen.getByText("Show date picker!")
fireEvent.press(text)
let p = screen.getByTestId("dateTimePicker")
console.log(p)
})
})
我得到错误Unable to find an element with testID: dateTimePicker
所以我想知道,如何从Jest更改DatePicker上的日期,并测试标签是否用所选日期更新。
import React from 'react';
import renderer from 'react-test-renderer';
import {fireEvent, render, screen, waitFor, userEvent} from '@testing-library/react-native';
import App from "../app"
jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper')
// Utility function to prepare the date to be accepted by DatePicker's onChange method
const createDateTimeSetEvtParams = (
date: Date,
): [DateTimePickerEvent, Date] => {
return [
{
type: 'set',
nativeEvent: {
timestamp: date.getTime(),
},
},
date,
];
};
describe('Date Picker Tests', () => {
it.only("changing the date of datepicker", async() => {
// mock the function we expect to be called when date is changed
let testFunction = jest.fn()
// render the parent
render(<App/>)
// Press the button to make the DatePicker visible
fireEvent.press(screen.getByText("Show date picker!"))
// Generate new date
let date = new Date()
// Fire the onChange Event
fireEvent(
UNSAFE_getByType(DateTimePicker),
'onChange',
...createDateTimeSetEvtParams(date),
))
expect(testFunction).toHaveBeenCalled()
})
})