Skip to content

Commit 3f78533

Browse files
committed
add tests
1 parent f46fe43 commit 3f78533

File tree

4 files changed

+33
-7
lines changed

4 files changed

+33
-7
lines changed

src/error-wrapper.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ export class ErrorWrapper {
5555
trigger() {
5656
throw this.wrapperError('trigger')
5757
}
58+
59+
unmount() {
60+
throw this.wrapperError('unmount')
61+
}
5862
}

src/vue-wrapper.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ComponentPublicInstance, nextTick, App } from 'vue'
1+
import { ComponentPublicInstance, nextTick, App, render } from 'vue'
22
import { ShapeFlags } from '@vue/shared'
33

44
import { DOMWrapper } from './dom-wrapper'
@@ -14,11 +14,11 @@ export class VueWrapper<T extends ComponentPublicInstance>
1414
implements WrapperAPI {
1515
private componentVM: T
1616
private rootVM: ComponentPublicInstance
17-
private __app: App
17+
private __app: App | null
1818
private __setProps: (props: Record<string, any>) => void
1919

2020
constructor(
21-
app: App,
21+
app: App | null,
2222
vm: ComponentPublicInstance,
2323
setProps?: (props: Record<string, any>) => void
2424
) {
@@ -99,15 +99,15 @@ export class VueWrapper<T extends ComponentPublicInstance>
9999

100100
findComponent(selector: FindComponentSelector): VueWrapper<T> | ErrorWrapper {
101101
if (typeof selector === 'object' && 'ref' in selector) {
102-
return createWrapper(this.vm.$refs[selector.ref] as T)
102+
return createWrapper(null, this.vm.$refs[selector.ref] as T)
103103
}
104104
const result = find(this.vm.$.subTree, selector)
105105
if (!result.length) return new ErrorWrapper({ selector })
106-
return createWrapper(result[0])
106+
return createWrapper(null, result[0])
107107
}
108108

109109
findAllComponents(selector: FindAllComponentsSelector): VueWrapper<T>[] {
110-
return find(this.vm.$.subTree, selector).map((c) => createWrapper(c))
110+
return find(this.vm.$.subTree, selector).map((c) => createWrapper(null, c))
111111
}
112112

113113
findAll<T extends Element>(selector: string): DOMWrapper<T>[] {
@@ -130,6 +130,13 @@ export class VueWrapper<T extends ComponentPublicInstance>
130130
}
131131

132132
unmount() {
133+
// preventing dispose of child component
134+
if (!this.__app) {
135+
throw new Error(
136+
`wrapper.unmount() can only be called by the root wrapper`
137+
)
138+
}
139+
133140
if (this.parentElement) {
134141
this.parentElement.removeChild(this.element)
135142
}

tests/findComponent.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,9 @@ describe('findComponent', () => {
8686
expect(wrapper.findComponent(Hello).text()).toBe('Hello world')
8787
expect(wrapper.findComponent(compC).text()).toBe('C')
8888
})
89+
90+
it('throw error if trying to unmount component from find', () => {
91+
const wrapper = mount(compA)
92+
expect(wrapper.findComponent(Hello).unmount).toThrowError()
93+
})
8994
})

tests/lifecycle.spec.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
nextTick,
66
onBeforeMount,
77
onUnmounted,
8-
onBeforeUnmount
8+
onBeforeUnmount,
9+
ref
910
} from 'vue'
1011

1112
import { mount } from '../src'
@@ -53,10 +54,19 @@ describe('lifecycles', () => {
5354
expect(onBeforeUnmountFn).not.toHaveBeenCalled()
5455
expect(onUnmountFn).not.toHaveBeenCalled()
5556

57+
const removeChildSpy = jest.spyOn(
58+
wrapper.element.parentElement,
59+
'removeChild'
60+
)
61+
62+
const el = wrapper.element
63+
5664
wrapper.unmount()
5765

5866
expect(beforeUnmountFn).toHaveBeenCalled()
5967
expect(onBeforeUnmountFn).toHaveBeenCalled()
6068
expect(onUnmountFn).toHaveBeenCalled()
69+
70+
expect(removeChildSpy).toHaveBeenCalledWith(el)
6171
})
6272
})

0 commit comments

Comments
 (0)