用 jest 测试 Vue 过滤器

Posted

技术标签:

【中文标题】用 jest 测试 Vue 过滤器【英文标题】:Testing Vue filters with jest 【发布时间】:2018-07-02 02:26:09 【问题描述】:

我正在尝试使用 jest 为我的 Vue 项目中的一个过滤器编写测试,我可以在不使用任何组件的情况下测试该过滤器吗?我的意思是我可以将它作为一个单元(如函数)进行测试吗?我搜索了很多,但找不到任何东西可以告诉我如何在 Vue 中为过滤器编写单独的测试

import Vue from 'vue'

export default function () 
    Vue.filter('englishNumber', (value) => 
        if (value === '۰') return 0
        if (!value) return ''
        if (typeof value !== 'string') 
            value = value.toString()
        
        return value.replace(/[\u06F0-\u06F9]+/g, function (digit) 
            let ret = ''
            for (let i = 0, len = digit.length; i < len; i++) 
                ret += String.fromCharCode(digit.charCodeAt(i) - 1728)
            
            return ret
        )
    )

这是我要测试的过滤器 有谁知道如何编写这种测试?

【问题讨论】:

【参考方案1】:

单元测试 Vue 过滤器的正确方法是在组件中本地声明它(使用 Vue 的 API 和 Vue.filter)。 然后,您可以在 Vue 组件中编写单元测试。 可以查看this case

【讨论】:

这仅在过滤器用于单个组件时才有效。如果您尝试共享组件,这将导致一堆不必要的重复代码和测试。【参考方案2】:

如果您编写的filters 用于多个组件,那么它很容易测试。

由于Vue.filter 只接受一个函数,您可以通过导出定义来独立于过滤器为该函数编写一个测试,如下所示:

// Define the function independently and export it
export const englishNumber = function (value) 
  if (value === '۰') return 0
  if (!value) return ''
  if (typeof value !== 'string') 
    value = value.toString()
  
  return value.replace(/[\u06F0-\u06F9]+/g, function (digit) 
    let ret = ''
    for (let i = 0, len = digit.length; i < len; i++) 
      ret += String.fromCharCode(digit.charCodeAt(i) - 1728)
    
    return ret
  )


// Pass the function in to the filter defintion
Vue.filter('englishNumber', englishNumber)

然后在您的测试文件中,导入该函数并像您做其他任何事情一样对其进行测试:

import  englishNumber  from '#/lib/filters.js'

describe("englishNumber")  
  it("does whatever") 
    expect(englishNumber("actual")).toEqual("expected")
  

【讨论】:

【参考方案3】:

我们可以使用手工制作的组件来测试过滤器。例如,我们有一个将日期转换为所需格式的过滤器:

// filters.js

import Vue from "vue";

Vue.filter("dateFormat", (incomingDate) => 
  // does the work here

所以我们可以通过以下方式对其进行测试:

// filters.spec.js

import Vue from "vue";
import "@/components/filters";
import  mount, createLocalVue  from "@vue/test-utils";

const myComponent = Vue.component("myComponent", 
  data() 
    return 
      date: new Date("January 1, 2020 01:10:30")
    ;
  ,
  template: "<p>  date | dateFormat  </p>"
);

const localVue = createLocalVue();

describe("filter dateFormat", () => 
  it("filter transforms date to readable format", () => 
    const wrapper = mount(myComponent, 
      localVue
    );
    expect(wrapper.html()).toBe("<p> 01 January 2020 </p>");
  );
);

【讨论】:

嗯,这是测试过滤器的最佳方法。测试过滤器功能本身很好,但我更喜欢你的方法,更“在情况下”:)

以上是关于用 jest 测试 Vue 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

用 Jest 测试 Vue 失败,Jest 遇到了意外的令牌,SyntaxError: Unexpected token import

Vue & Jest。子组件发出事件时调用测试方法

带有 vue-test-utils 和 Jest 的 Vue.js 单元测试用例失败

用 jest 进行 Vue 测试:$route 始终未定义

vue3配置jest测试环境踩坑

单元测试 Nest JS 过滤器捕获方法