用Jasmine测试Vue.js中的Watchers

时间:2018-05-29 15:14:53

标签: javascript unit-testing vue.js jasmine

我想测试一个VueJS观察者方法,检查它是否被调用。我的方法看起来像:

watch: {
   value: (newValue, oldValue) {
     if (newValue.Status === 'Completed') {
        ...do somethind
     }
  }
}

当方法被触发时,该方法正在工作,但是没有触发测试。

我的测试看起来像:

var propsData = {
   "value" : {
      "Status" : "Something"
    }
}
it('should call method', done => {
   const Constructor = Vue.extend(App);
   const spy = sinon.spy(App, 'value');
   const vm = new Constructor({ propsData: propsData }).$mount();
   vm.value.Status = 'Completed';
   Vue.nextTick(() => {
      expect(spy.called).to.be.true;
      done()
   })
})

我找到了以下示例,但似乎无法解决我的问题:

  1. Asserting Asynchronous Updates
  2. Forum

1 个答案:

答案 0 :(得分:0)

您正在更改value.Status,而不是实际value引用。要在值更改时启用监视触发器,您可以使用deep: true

watch: {
   value: {
     handler: (newValue, oldValue) {
       this.checkValue() 
     },
     deep: true
   }
},
methods: {
  checkValue() {
  }
}

然后

it('should call method', done => {
   const Constructor = Vue.extend(App);
   const vm = new Constructor({ propsData: propsData }).$mount();
   const spy = sinon.spy(vm, 'checkValue');
   vm.value.Status = 'New value';
   vm.$nextTick(() => {
      expect(spy.called).to.be.true;
      done()
   })
})