/
dom.js
50 lines (41 loc) 路 1.44 KB
/
dom.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// this helps us track what the state is before and after an event is fired
// this is needed for determining the snapshot values
const actual = jest.requireActual('@testing-library/dom')
function getTrackedElementValues(element) {
return {
value: element.value,
checked: element.checked,
selectionStart: element.selectionStart,
selectionEnd: element.selectionEnd,
// unfortunately, changing a select option doesn't happen within fireEvent
// but rather imperatively via `options.selected = newValue`
// because of this we don't (currently) have a way to track before/after
// in a given fireEvent call.
}
}
function wrapWithTestData(fn) {
return (element, init) => {
const before = getTrackedElementValues(element)
const testData = {before}
// put it on the element so the event handler can grab it
element.testData = testData
const result = fn(element, init)
const after = getTrackedElementValues(element)
Object.assign(testData, {after})
// elete the testData for the next event
delete element.testData
return result
}
}
const mockFireEvent = wrapWithTestData(actual.fireEvent)
for (const key of Object.keys(actual.fireEvent)) {
if (typeof actual.fireEvent[key] === 'function') {
mockFireEvent[key] = wrapWithTestData(actual.fireEvent[key], key)
} else {
mockFireEvent[key] = actual.fireEvent[key]
}
}
module.exports = {
...actual,
fireEvent: mockFireEvent,
}