data.spec.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import Vue from 'vue'
  2. describe('Options data', () => {
  3. it('should proxy and be reactive', done => {
  4. const data = { msg: 'foo' }
  5. const vm = new Vue({
  6. data,
  7. template: '<div>{{ msg }}</div>'
  8. }).$mount()
  9. expect(vm.$data).toEqual({ msg: 'foo' })
  10. expect(vm.$data).toBe(data)
  11. data.msg = 'bar'
  12. waitForUpdate(() => {
  13. expect(vm.$el.textContent).toBe('bar')
  14. }).then(done)
  15. })
  16. it('should merge data properly', () => {
  17. const Test = Vue.extend({
  18. data () {
  19. return { a: 1 }
  20. }
  21. })
  22. let vm = new Test({
  23. data: { b: 2 }
  24. })
  25. expect(vm.a).toBe(1)
  26. expect(vm.b).toBe(2)
  27. // no instance data
  28. vm = new Test()
  29. expect(vm.a).toBe(1)
  30. // no child-val
  31. const Extended = Test.extend({})
  32. vm = new Extended()
  33. expect(vm.a).toBe(1)
  34. // recursively merge objects
  35. const WithObject = Vue.extend({
  36. data () {
  37. return {
  38. obj: {
  39. a: 1
  40. }
  41. }
  42. }
  43. })
  44. vm = new WithObject({
  45. data: {
  46. obj: {
  47. b: 2
  48. }
  49. }
  50. })
  51. expect(vm.obj.a).toBe(1)
  52. expect(vm.obj.b).toBe(2)
  53. })
  54. it('should warn non-function during extend', () => {
  55. Vue.extend({
  56. data: { msg: 'foo' }
  57. })
  58. expect('The "data" option should be a function').toHaveBeenWarned()
  59. })
  60. it('should warn non object return', () => {
  61. new Vue({
  62. data () {}
  63. })
  64. expect('data functions should return an object').toHaveBeenWarned()
  65. })
  66. it('should warn replacing root $data', () => {
  67. const vm = new Vue({
  68. data: {}
  69. })
  70. vm.$data = {}
  71. expect('Avoid replacing instance root $data').toHaveBeenWarned()
  72. })
  73. })