Skip to content

Commit 545f53d

Browse files
committed
fully convert to rtl, remove enzyme and test renderer deps
1 parent 1e0ad89 commit 545f53d

File tree

1 file changed

+66
-52
lines changed

1 file changed

+66
-52
lines changed

test/components/connect.spec.js

Lines changed: 66 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import PropTypes from 'prop-types'
66
import ReactDOM from 'react-dom'
77
import { createStore } from 'redux'
88
import { createProvider, connect } from '../../src/index.js'
9-
import { TestRenderer, enzyme } from '../getTestDeps.js'
109
import * as rtl from 'react-testing-library'
1110
import 'jest-dom/extend-expect'
1211

@@ -1578,19 +1577,24 @@ describe('React', () => {
15781577
const decorator = connect(state => state)
15791578
const Decorated = decorator(Container)
15801579

1581-
const testRenderer = enzyme.mount(
1580+
class Wrapper extends Component {
1581+
render() {
1582+
return (
1583+
<Decorated ref={comp => comp.getWrappedInstance()}/>
1584+
)
1585+
}
1586+
}
1587+
1588+
expect(() => rtl.render(
15821589
<ProviderMock store={store}>
1583-
<Decorated />
1590+
<Wrapper />
15841591
</ProviderMock>
1585-
)
1586-
1587-
const decorated = testRenderer.find(Decorated)
1588-
expect(() => decorated.instance().getWrappedInstance()).toThrow(
1592+
)).toThrow(
15891593
/To access the wrapped instance, you need to specify \{ withRef: true \} in the options argument of the connect\(\) call\./
15901594
)
15911595
})
15921596

1593-
it('should return the instance of the wrapped component for use in calling child methods', () => {
1597+
it('should return the instance of the wrapped component for use in calling child methods', async (done) => {
15941598
const store = createStore(() => ({}))
15951599

15961600
const someData = {
@@ -1603,24 +1607,36 @@ describe('React', () => {
16031607
}
16041608

16051609
render() {
1606-
return <Passthrough />
1610+
return <Passthrough loaded="yes" />
16071611
}
16081612
}
16091613

16101614
const decorator = connect(state => state, null, null, { withRef: true })
16111615
const Decorated = decorator(Container)
16121616

1613-
const testRenderer = enzyme.mount(
1617+
let ref
1618+
1619+
class Wrapper extends Component {
1620+
render() {
1621+
return (
1622+
<Decorated ref={comp => {
1623+
if (!comp) return
1624+
ref = comp.getWrappedInstance()
1625+
}}/>
1626+
)
1627+
}
1628+
}
1629+
1630+
const tester = rtl.render(
16141631
<ProviderMock store={store}>
1615-
<Decorated />
1632+
<Wrapper />
16161633
</ProviderMock>
16171634
)
16181635

1619-
const decorated = testRenderer.find(Decorated)
1636+
await rtl.waitForElement(() => tester.getByTestId('loaded'))
16201637

1621-
expect(() => decorated.someInstanceMethod()).toThrow()
1622-
expect(decorated.instance().getWrappedInstance().someInstanceMethod()).toBe(someData)
1623-
expect(decorated.instance().wrappedInstance.someInstanceMethod()).toBe(someData)
1638+
expect(ref.someInstanceMethod()).toBe(someData)
1639+
done()
16241640
})
16251641

16261642
it('should wrap impure components without supressing updates', () => {
@@ -1639,10 +1655,12 @@ describe('React', () => {
16391655
const decorator = connect(state => state, null, null, { pure: false })
16401656
const Decorated = decorator(ImpureComponent)
16411657

1658+
let externalSetState
16421659
class StatefulWrapper extends Component {
16431660
constructor() {
16441661
super()
16451662
this.state = { value: 0 }
1663+
externalSetState = this.setState.bind(this)
16461664
}
16471665

16481666
getChildContext() {
@@ -1660,18 +1678,15 @@ describe('React', () => {
16601678
statefulValue: PropTypes.number
16611679
}
16621680

1663-
const testRenderer = enzyme.mount(
1681+
const tester = rtl.render(
16641682
<ProviderMock store={store}>
16651683
<StatefulWrapper />
16661684
</ProviderMock>
16671685
)
16681686

1669-
const target = testRenderer.find(Passthrough)
1670-
const wrapper = testRenderer.find(StatefulWrapper).instance()
1671-
expect(target.prop('statefulValue')).toEqual(0)
1672-
wrapper.setState({ value: 1 })
1673-
testRenderer.update()
1674-
expect(testRenderer.find(Passthrough).prop('statefulValue')).toEqual(1)
1687+
expect(tester.getByTestId('statefulValue')).toHaveTextContent('0')
1688+
externalSetState({ value: 1 })
1689+
expect(tester.getByTestId('statefulValue')).toHaveTextContent('1')
16751690
})
16761691

16771692
it('calls mapState and mapDispatch for impure components', () => {
@@ -1700,41 +1715,40 @@ describe('React', () => {
17001715
)
17011716
const Decorated = decorator(ImpureComponent)
17021717

1718+
let externalSetState
1719+
let storeGetter
17031720
class StatefulWrapper extends Component {
17041721
constructor() {
17051722
super()
1723+
storeGetter = { storeKey: 'foo' }
17061724
this.state = {
1707-
storeGetter: { storeKey: 'foo' }
1725+
storeGetter
17081726
}
1727+
externalSetState = this.setState.bind(this)
17091728
}
17101729
render() {
17111730
return <Decorated storeGetter={this.state.storeGetter} />
17121731
}
17131732
}
17141733

17151734

1716-
const testRenderer = enzyme.mount(
1735+
const tester = rtl.render(
17171736
<ProviderMock store={store}>
17181737
<StatefulWrapper />
17191738
</ProviderMock>
17201739
)
17211740

1722-
const target = testRenderer.find(Passthrough)
1723-
const wrapper = testRenderer.find(StatefulWrapper).instance()
1724-
17251741
expect(mapStateSpy).toHaveBeenCalledTimes(2)
17261742
expect(mapDispatchSpy).toHaveBeenCalledTimes(2)
1727-
expect(target.prop('statefulValue')).toEqual('foo')
1743+
expect(tester.getByTestId('statefulValue')).toHaveTextContent('foo')
17281744

17291745
// Impure update
1730-
const storeGetter = wrapper.state.storeGetter
17311746
storeGetter.storeKey = 'bar'
1732-
wrapper.setState({ storeGetter })
1733-
testRenderer.update()
1747+
externalSetState({ storeGetter })
17341748

17351749
expect(mapStateSpy).toHaveBeenCalledTimes(3)
17361750
expect(mapDispatchSpy).toHaveBeenCalledTimes(3)
1737-
expect(testRenderer.find(Passthrough).prop('statefulValue')).toEqual('bar')
1751+
expect(tester.getByTestId('statefulValue')).toHaveTextContent('bar')
17381752
})
17391753

17401754
it('should pass state consistently to mapState', () => {
@@ -1772,7 +1786,7 @@ describe('React', () => {
17721786
}
17731787
}
17741788

1775-
const testRenderer = enzyme.mount(
1789+
const tester = rtl.render(
17761790
<ProviderMock store={store}>
17771791
<Container />
17781792
</ProviderMock>
@@ -1787,8 +1801,8 @@ describe('React', () => {
17871801
expect(childMapStateInvokes).toBe(2)
17881802

17891803
// setState calls DOM handlers are batched
1790-
const button = testRenderer.find('button')
1791-
button.prop('onClick')()
1804+
const button = tester.getByText('change')
1805+
rtl.fireEvent.click(button)
17921806
expect(childMapStateInvokes).toBe(3)
17931807

17941808
store.dispatch({ type: 'APPEND', body: 'd' })
@@ -1811,7 +1825,7 @@ describe('React', () => {
18111825
}
18121826
}
18131827

1814-
enzyme.mount(
1828+
rtl.render(
18151829
<ProviderMock store={store}>
18161830
<Container />
18171831
</ProviderMock>
@@ -1844,7 +1858,7 @@ describe('React', () => {
18441858
}
18451859
}
18461860

1847-
enzyme.mount(
1861+
rtl.render(
18481862
<ProviderMock store={store}>
18491863
<Container />
18501864
</ProviderMock>
@@ -1894,7 +1908,7 @@ describe('React', () => {
18941908
}
18951909
}
18961910

1897-
enzyme.mount(
1911+
rtl.render(
18981912
<ProviderMock store={store}>
18991913
<Container />
19001914
</ProviderMock>
@@ -1937,7 +1951,7 @@ describe('React', () => {
19371951
}
19381952
}
19391953

1940-
enzyme.mount(
1954+
rtl.render(
19411955
<ProviderMock store={store}>
19421956
<div>
19431957
<Container name="a" />
@@ -1973,7 +1987,7 @@ describe('React', () => {
19731987
}
19741988
}
19751989

1976-
enzyme.mount(
1990+
rtl.render(
19771991
<ProviderMock store={store}>
19781992
<div>
19791993
<Container name="a" />
@@ -2037,7 +2051,7 @@ describe('React', () => {
20372051
}
20382052
}
20392053

2040-
enzyme.mount(
2054+
rtl.render(
20412055
<ProviderMock store={store}>
20422056
<Container />
20432057
</ProviderMock>
@@ -2061,7 +2075,7 @@ describe('React', () => {
20612075
}
20622076
}
20632077

2064-
enzyme.mount(
2078+
rtl.render(
20652079
<ProviderMock store={store}>
20662080
<Container />
20672081
</ProviderMock>
@@ -2097,7 +2111,7 @@ describe('React', () => {
20972111
}
20982112
}
20992113

2100-
enzyme.mount(
2114+
rtl.render(
21012115
<ProviderMock store={store}>
21022116
<Parent>
21032117
<Container />
@@ -2176,7 +2190,7 @@ describe('React', () => {
21762190
}
21772191
}
21782192

2179-
enzyme.mount(
2193+
rtl.render(
21802194
<ProviderMock store={store}>
21812195
<ImpureComponent />
21822196
</ProviderMock>
@@ -2192,7 +2206,7 @@ describe('React', () => {
21922206
const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
21932207

21942208
try {
2195-
enzyme.mount(
2209+
rtl.render(
21962210
<ProviderMock store={store}>
21972211
<Component pass="through" />
21982212
</ProviderMock>
@@ -2253,7 +2267,7 @@ describe('React', () => {
22532267
}
22542268

22552269
const store = createStore((state = 0, action) => (action.type === 'INC' ? state + 1 : state))
2256-
enzyme.mount(<ProviderMock store={store}><Parent /></ProviderMock>)
2270+
rtl.render(<ProviderMock store={store}><Parent /></ProviderMock>)
22572271

22582272
expect(mapStateToProps).toHaveBeenCalledTimes(1)
22592273
store.dispatch({ type: 'INC' })
@@ -2275,7 +2289,7 @@ describe('React', () => {
22752289
class C extends React.Component { render() { return <div>{this.props.count}</div> }}
22762290

22772291
const store = createStore((state = 0, action) => (action.type === 'INC' ? state += 1 : state))
2278-
enzyme.mount(<ProviderMock store={store}><A /></ProviderMock>)
2292+
rtl.render(<ProviderMock store={store}><A /></ProviderMock>)
22792293

22802294
store.dispatch({ type: 'INC' })
22812295
})
@@ -2307,7 +2321,7 @@ describe('React', () => {
23072321
render() { return <div>{this.props.count}</div> }
23082322
}
23092323

2310-
enzyme.mount(<ProviderMock store={store1}><A /></ProviderMock>)
2324+
rtl.render(<ProviderMock store={store1}><A /></ProviderMock>)
23112325
expect(mapStateToPropsB).toHaveBeenCalledTimes(1)
23122326
expect(mapStateToPropsC).toHaveBeenCalledTimes(1)
23132327
expect(mapStateToPropsD).toHaveBeenCalledTimes(1)
@@ -2337,7 +2351,7 @@ describe('React', () => {
23372351
}
23382352
}
23392353

2340-
TestRenderer.create(
2354+
rtl.render(
23412355
<React.StrictMode>
23422356
<ProviderMock store={store}>
23432357
<Container />
@@ -2350,6 +2364,7 @@ describe('React', () => {
23502364

23512365
it('should receive the store in the context using a custom store key', () => {
23522366
const store = createStore(() => ({}))
2367+
store.dispatch.mine = 'hi'
23532368
const CustomProvider = createProvider('customStoreKey')
23542369
const connectOptions = { storeKey: 'customStoreKey' }
23552370

@@ -2360,14 +2375,13 @@ describe('React', () => {
23602375
}
23612376
}
23622377

2363-
const testRenderer = enzyme.mount(
2378+
const tester = rtl.render(
23642379
<CustomProvider store={store}>
23652380
<Container />
23662381
</CustomProvider>
23672382
)
23682383

2369-
const container = testRenderer.find(Container)
2370-
expect(container.instance().store).toBe(store)
2384+
expect(tester.getByTestId('dispatch')).toHaveTextContent('[my function dispatch]')
23712385
})
23722386
})
23732387
})

0 commit comments

Comments
 (0)