VUEX Getter 在测试期间出现错误:TypeError: this.[method_name] is not a function

Posted

技术标签:

【中文标题】VUEX Getter 在测试期间出现错误:TypeError: this.[method_name] is not a function【英文标题】:VUEX Getter is Getting Error During Testing: TypeError: this.[method_name] is not a function 【发布时间】:2021-09-09 01:43:01 【问题描述】:

我让我的组件与 VUEX 商店一起使用,但在测试期间,我收到以下错误:

 ● farewell/list.vue › renders all farewells
    TypeError: this.allFarewellsAssociatedWithGreeting is not a function

我的组件、测试和存储 getter 代码发布在下面。

我更新了我的组件以使测试通过,但是实际的应用程序将无法运行。更新商店时组件不会呈现。这段代码也贴在下面。

如果我还能提供任何其他帮助解决问题的方法,请告诉我。或者,如果我可以采取任何步骤来进一步排除故障。

感谢您花时间帮助新手 ????

这是我的组件:

<template>
  <div>
    <p>Associated Farewells:</p>
    <ul>
      <li
        v-for="farewell in farewells"
        :key="farewell['id']"
      >
         farewell["attributes"]["message"] 
      </li>
    </ul>
  </div>
</template>

<script>
import  mapActions  from "vuex";
import  mapGetters  from "vuex";

export default 
  name: 'FarewellList',
  props: [
    'greeting',
  ],
  components: 
  ,
  computed: 
    ...mapGetters("farewells", ["allFarewellsAssociatedWithGreeting"]),
    farewells: 
      get() 
        return this.allFarewellsAssociatedWithGreeting(this.greeting);
      
    
  ,
  mounted() 
    this.getFarewells();
  ,
  methods: 
    ...mapActions("farewells", ["getFarewells"])
  
;
</script>

这是我的测试:

import  shallowMount  from "@vue/test-utils";
import Vuex from "vuex";
import Create from "@/components/farewell/list.vue";

describe("farewell/list.vue", () => 
  it("renders all farewells", () => 
    const expectedMessage = "arbitrary message";
    const expectedFarewell = 
      attributes: 
        message: expectedMessage
      
    ;
    let getters = 
      allFarewellsAssociatedWithGreeting: jest.fn(),
    ;
    getters.allFarewellsAssociatedWithGreeting.mockReturnValue([expectedFarewell]);
    let actions = 
      getFarewells: jest.fn(),
    ;
    let store = new Vuex.Store(
      modules: 
        farewells: 
          namespaced: true,
          getters,
          actions
        
      
    );
    const wrapper = shallowMount(Create, 
      global: 
        plugins: [store]
      
    );
  );
);

这是我的店员:

export const getters = 
  allFarewellsAssociatedWithGreeting: state => greeting => 
    return state.farewells.filter(farewell => 
      return farewell.relationships.greeting.data.id === greeting.id
    );
  ,
;

export default getters;

这是允许测试通过但会破坏实际应用程序的组件代码版本。该组件不会使用商店中的更新数据重新渲染。

<script>
import  mapActions  from "vuex";
import  mapGetters  from "vuex";

export default 
  name: 'FarewellList',
  props: [
    'greeting',
  ],
  components: 
  ,
  computed: 
    farewells: 
      get() 
        return this.fetchFarewells();
      
    
  ,
  mounted() 
    this.getFarewells();
  ,
  methods: 
    ...mapGetters("farewells", ["allFarewellsAssociatedWithGreeting"]),
    ...mapActions("farewells", ["getFarewells"]),
    fetchFarewells() 
      return this.allFarewellsAssociatedWithGreeting(this.greeting);
    ,
  
;
</script>

【问题讨论】:

【参考方案1】:

问题是实际的allFarewellsAssociatedWithGreeting getter 返回一个返回数组的函数,但它的模拟 getter 返回的是数组而不是函数。

解决方法就是让模拟返回一个函数:

// getters.allFarewellsAssociatedWithGreeting.mockReturnValue([expectedFarewell]);

getters.allFarewellsAssociatedWithGreeting.mockReturnValue(() => [expectedFarewell]);

demo

【讨论】:

感谢您抽出宝贵时间帮助解决此问题。您的解决方案使我找到了解决问题的方法,并进一步了解了 javascript 的虚拟 getter/setter。再次感谢??

以上是关于VUEX Getter 在测试期间出现错误:TypeError: this.[method_name] is not a function的主要内容,如果未能解决你的问题,请参考以下文章

测试调用 Getter 和 Mutations 的 Vuex 动作

如何在 Mocha 单元测试中访问命名空间的 Vuex getter

Vuex 语法错误与 localcomputed 函数结合 getter 和 setter

模拟单元测试的 Vuex getter 会产生意想不到的结果

Vue & Vuex getter 数组过滤器仅导致在线错误

Vue 单元测试:如何使用 props、vuex store、watchers、getter 等测试复杂组件