Skip to content

Commit ad9d32a

Browse files
vouilleddyerburgh
authored andcommitted
feat(destroy): add destroy wrapper method (#129)
* Added Destroy method to wrapper * Added Destroy method to wrapper-array * Changed update to destroy * Added destroy to type/index.d.ts * Added destroy array test * Added doc * updated doc * Updated wording * Added destroy to summary * Added destroy to wrapper doc
1 parent d3846a8 commit ad9d32a

File tree

11 files changed

+117
-1
lines changed

11 files changed

+117
-1
lines changed

docs/en/SUMMARY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
* [text](api/wrapper/text.md)
4444
* [trigger](api/wrapper/trigger.md)
4545
* [update](api/wrapper/update.md)
46+
* [destroy](api/wrapper/destroy.md)
4647
* [WrapperArray](api/wrapper-array/README.md)
4748
* [at](api/wrapper-array/at.md)
4849
* [contains](api/wrapper-array/contains.md)
@@ -58,5 +59,6 @@
5859
* [setProps](api/wrapper-array/setProps.md)
5960
* [trigger](api/wrapper-array/trigger.md)
6061
* [update](api/wrapper-array/update.md)
62+
* [destroy](api/wrapper-array/destroy.md)
6163
* [Selectors](api/selectors.md)
6264
* [createLocalVue](api/createLocalVue.md)

docs/en/api/wrapper-array/destroy.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# destroy()
2+
3+
Destroys each Vue `Wrapper` in `WrapperArray`.
4+
5+
- **Example:**
6+
7+
```js
8+
import { mount } from 'vue-test-utils'
9+
import { expect } from 'chai'
10+
import Foo from './Foo.vue'
11+
12+
const wrapper = mount(Foo)
13+
const divArray = wrapper.findAll('div')
14+
expect(divArray.contains('p')).toBe(true)
15+
divArray.destroy()
16+
expect(divArray.contains('p')).toBe(false)
17+
18+
```

docs/en/api/wrapper/destroy.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# destroy()
2+
3+
Destroys a Vue component instance.
4+
5+
- **Example:**
6+
7+
```js
8+
import { mount } from 'vue-test-utils'
9+
import { expect } from 'chai'
10+
import sinon from 'sinon'
11+
12+
const spy = sinon.stub()
13+
mount({
14+
render: null,
15+
destroyed () {
16+
spy()
17+
}
18+
}).destroy()
19+
expect(spy.calledOnce).to.equal(true)
20+
```

flow/wrapper.flow.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ declare interface BaseWrapper { // eslint-disable-line no-undef
2828
setMethods(methods: Object): void,
2929
setProps(data: Object): void,
3030
trigger(type: string, options: Object): void,
31-
update(): void
31+
update(): void,
32+
destroy(): void
3233
}
3334

3435
declare type WrapperOptions = { // eslint-disable-line no-undef

src/wrappers/error-wrapper.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,8 @@ export default class ErrorWrapper implements BaseWrapper {
9999
update (): void {
100100
throwError(`find did not return ${this.selector}, cannot call update() on empty Wrapper`)
101101
}
102+
103+
destroy (): void {
104+
throwError(`find did not return ${this.selector}, cannot call destroy() on empty Wrapper`)
105+
}
102106
}

src/wrappers/wrapper-array.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,10 @@ export default class WrapperArray implements BaseWrapper {
154154

155155
this.wrappers.forEach(wrapper => wrapper.update())
156156
}
157+
158+
destroy (): void {
159+
this.throwErrorIfWrappersIsEmpty('destroy')
160+
161+
this.wrappers.forEach(wrapper => wrapper.destroy())
162+
}
157163
}

src/wrappers/wrapper.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,21 @@ export default class Wrapper implements BaseWrapper {
384384
return this.element.textContent
385385
}
386386

387+
/**
388+
* Calls destroy on vm
389+
*/
390+
destroy () {
391+
if (!this.isVueComponent) {
392+
throwError('wrapper.destroy() can only be called on a Vue instance')
393+
}
394+
395+
if (this.vm.$el.parentNode) {
396+
this.vm.$el.parentNode.removeChild(this.vm.$el)
397+
}
398+
399+
this.vm.$destroy()
400+
}
401+
387402
/**
388403
* Dispatches a DOM event on wrapper
389404
*/
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { compileToFunctions } from 'vue-template-compiler'
2+
import mount from '~src/mount'
3+
import sinon from 'sinon'
4+
5+
describe('destroy', () => {
6+
it('should trigger beforeDestroy ', () => {
7+
const spy = sinon.stub()
8+
mount({
9+
render: null,
10+
beforeDestroy () {
11+
spy()
12+
}
13+
}).destroy()
14+
expect(spy.calledOnce).to.equal(true)
15+
})
16+
17+
it('should trigger destroy ', () => {
18+
const spy = sinon.stub()
19+
mount({
20+
render: null,
21+
destroyed () {
22+
spy()
23+
}
24+
}).destroy()
25+
expect(spy.calledOnce).to.equal(true)
26+
})
27+
28+
it('should remove element from document.body', () => {
29+
const compiled = compileToFunctions('<div></div>')
30+
const wrapper = mount(compiled, { attachToDocument: true })
31+
expect(wrapper.vm.$el.parentNode).to.equal(document.body)
32+
wrapper.destroy()
33+
expect(wrapper.vm.$el.parentNode).to.be.null
34+
})
35+
})

test/unit/specs/wrappers/error-wrapper.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,11 @@ describe('ErrorWrapper', () => {
154154
const error = new ErrorWrapper(selector)
155155
expect(() => error.update()).to.throw().with.property('message', message)
156156
})
157+
158+
it('destroy throws error when called', () => {
159+
const selector = 'div'
160+
const message = `[vue-test-utils]: find did not return ${selector}, cannot call destroy() on empty Wrapper`
161+
const error = new ErrorWrapper(selector)
162+
expect(() => error.destroy()).to.throw().with.property('message', message)
163+
})
157164
})

test/unit/specs/wrappers/wrapper-array.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,11 @@ describe('WrapperArray', () => {
258258
wrapperArray.update()
259259
expect(update.calledTwice).to.equal(true)
260260
})
261+
262+
it('destroy calls destroy on each wrapper', () => {
263+
const destroy = sinon.stub()
264+
const wrapperArray = new WrapperArray([{ destroy }, { destroy }])
265+
wrapperArray.destroy()
266+
expect(destroy.calledTwice).to.equal(true)
267+
})
261268
})

0 commit comments

Comments
 (0)