如何监视 vuex 订阅者中的方法?

Posted

技术标签:

【中文标题】如何监视 vuex 订阅者中的方法?【英文标题】:How do I spy on Methods in a vuex subscriber? 【发布时间】:2021-07-22 14:59:00 【问题描述】:

在 Vue 组件的 created() 中,我有一个订阅 Vuex 商店的 Mutation 的订阅者。 我试图监视触发订阅者时调用的方法。 这是我的第一次直观尝试:

//Vue-Component
created()
     this.$store.subscribe((mutation) => 
      if (mutation.type === "mutationname") 
        this.methodToBeSpiedOn();
      
    );


//jest
import Component from "..."; 
...
const setSelectedCompanySpy = jest.spyOn(
    Component.methods,
    "methodToBeSpiedOn"
);
componentwrapper.vm.$store.commit("mutationname") 
expect(methodToBeSpiedOn).toBeCalled();

现在我想,可能是因为 Reactivity 并且测试需要更多时间来触发订阅者等等。

所以我尝试使用 setTimeout():

setTimeout(() => 
     expect(methodToBeSpiedOn).toBeCalled();
     done();
, 10000);

但这也不起作用。

所以我的问题是:如何监视在 Vuex 订阅者中调用的方法?

或者我的方法完全错误,我不应该这样测试订阅者?

【问题讨论】:

【参考方案1】:

spyOn 上的Component.methods 可能不起作用,因为vm 是分配组件方法的主要对象。

使用vm,如以下示例:

const setSelectedCompanySpy = jest.spyOn(
    componentwrapper.vm,
    "methodToBeSpiedOn"
);

expect(setSelectedCompanySpy).toBeCalled();

【讨论】:

我有 2 个问题: 1. 假设您测试创建的 Lifecyclehook。在这种情况下,我监视的函数将在 componentwrapper.vm 存在之前执行。在这种情况下我该怎么办?因为我尝试了您的方法,但测试仍然失败。 2. 我将 Component.methods 用于 spyon 工作正常的非订阅者案例。 @telion 完成创建的生命周期,您可以使用await wrapper.vm.$nextTick(),然后添加您的expect

以上是关于如何监视 vuex 订阅者中的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看和修改请求订阅属性 (SQL Server Management Studio)

vuex 订阅单个突变

如何在ROS下编写自己的节点来订阅话题

vue2.x双向数据绑定原理

Vuex 变异订阅触发多次

如何在ROS上一个节点同时实现发布和订阅