2
0

errorCaptured.spec.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import Vue from 'vue'
  2. describe('Options errorCaptured', () => {
  3. let globalSpy
  4. beforeEach(() => {
  5. globalSpy = Vue.config.errorHandler = jasmine.createSpy()
  6. })
  7. afterEach(() => {
  8. Vue.config.errorHandler = null
  9. })
  10. it('should capture error from child component', () => {
  11. const spy = jasmine.createSpy()
  12. let child
  13. let err
  14. const Child = {
  15. created () {
  16. child = this
  17. err = new Error('child')
  18. throw err
  19. },
  20. render () {}
  21. }
  22. new Vue({
  23. errorCaptured: spy,
  24. render: h => h(Child)
  25. }).$mount()
  26. expect(spy).toHaveBeenCalledWith(err, child, 'created hook')
  27. // should not propagate by default
  28. expect(globalSpy).not.toHaveBeenCalled()
  29. })
  30. it('should be able to render the error in itself', done => {
  31. let child
  32. const Child = {
  33. created () {
  34. child = this
  35. throw new Error('error from child')
  36. },
  37. render () {}
  38. }
  39. const vm = new Vue({
  40. data: {
  41. error: null
  42. },
  43. errorCaptured (e, vm, info) {
  44. expect(vm).toBe(child)
  45. this.error = e.toString() + ' in ' + info
  46. },
  47. render (h) {
  48. if (this.error) {
  49. return h('pre', this.error)
  50. }
  51. return h(Child)
  52. }
  53. }).$mount()
  54. waitForUpdate(() => {
  55. expect(vm.$el.textContent).toContain('error from child')
  56. expect(vm.$el.textContent).toContain('in created hook')
  57. }).then(done)
  58. })
  59. it('should propagate to global handler when returning true', () => {
  60. const spy = jasmine.createSpy()
  61. let child
  62. let err
  63. const Child = {
  64. created () {
  65. child = this
  66. err = new Error('child')
  67. throw err
  68. },
  69. render () {}
  70. }
  71. new Vue({
  72. errorCaptured (err, vm, info) {
  73. spy(err, vm, info)
  74. return true
  75. },
  76. render: h => h(Child, {})
  77. }).$mount()
  78. expect(spy).toHaveBeenCalledWith(err, child, 'created hook')
  79. // should propagate
  80. expect(globalSpy).toHaveBeenCalledWith(err, child, 'created hook')
  81. })
  82. it('should propagate to global handler if itself throws error', () => {
  83. let child
  84. let err
  85. const Child = {
  86. created () {
  87. child = this
  88. err = new Error('child')
  89. throw err
  90. },
  91. render () {}
  92. }
  93. let err2
  94. const vm = new Vue({
  95. errorCaptured () {
  96. err2 = new Error('foo')
  97. throw err2
  98. },
  99. render: h => h(Child, {})
  100. }).$mount()
  101. expect(globalSpy).toHaveBeenCalledWith(err, child, 'created hook')
  102. expect(globalSpy).toHaveBeenCalledWith(err2, vm, 'errorCaptured hook')
  103. })
  104. })