vue.js est unit - 如何根据计算值测试观察者? (不推荐使用 setComputed)

Posted

技术标签:

【中文标题】vue.js est unit - 如何根据计算值测试观察者? (不推荐使用 setComputed)【英文标题】:vue.js est unit -How to test a a watcher based on computed value ? ( setComputed is deprecated) 【发布时间】:2019-03-25 14:58:40 【问题描述】:

我的组件中有一个语言观察者 我从 getter 获取当前语言(它的值从工具栏语言选择器更改,state.language 中的默认值为“en”)

ContactForm.vue

  ...
  data() 
    return 
      contactLang: "",
      ...
    ;
  ,
  computed: 
        ...mapGetters(["language"]),
      ,
      watch: 
        language(newLanguage) 
          console.lo("language changed to: ", newLanguage);
          this.contactLang = newLanguage;
          this.$validator.localize(newLanguage);
        
      ,

=======================

我正在尝试测试监视块

ContactForm.spec.js

beforeEach(() => 
    // create a fresh store instance for every test case.
    storeMocks = createStoreMocks();
    options = 
      sync: false,
      provide: () => (
        $validator: v
      ),
      store: storeMocks.store,
      i18n
    ;
    wrapper = shallowMount(ContactForm, options);
  );


  it("change the form language when locale changed", () => 
    // update the Vuex store language , but it does not trigger the watcher ...
    wrapper.vm.$store.state.language = "fr";
    expect(wrapper.vm.contactLang).toBe("fr");
  );

有没有办法测试这个监视块,或者我应该重组我的代码以避免在这个组件中进行这样的测试...

【问题讨论】:

【参考方案1】:

我解决了这个问题...观察者是异步的,所以我只是延迟断言

  it("change the form language when locale changed", () => 
    // pdate the Vuex store language , but it does not trigger the watcher ...
    wrapper.vm.$store.state.language = "fr";
    setTimeout(() => 
      // assert changes operated by watcher
      expect(wrapper.vm.contactLang).toBe("fr");
  , 50);
  );

【讨论】:

以上是关于vue.js est unit - 如何根据计算值测试观察者? (不推荐使用 setComputed)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue.js 中计算部分值和总值?

Vue JS如何根据数组值删除对象

Vue.js 如何使用 v-model 和计算属性以及复选框来镜像输入字段

Vue JS如何根据传递的嵌套v-for值设置选项?

Vue js如何使用laravel根据数据库值自动选择复选框

Vue.js 如何从方法更改计算属性?