方法在单元测试中不可用

时间:2019-07-13 17:06:58

标签: javascript typescript unit-testing vue.js jestjs

我使用TypeScript在VueJS中创建了新项目。

我的组件具有测试方法:

<template>
    <div></div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

@Component
export default class Slider extends Vue {
  private slide: number = 0;
  private sliding: boolean = false;

  public setSlide(slide: number): void {
    this.slide = slide;
  }

  public setSliding(sliding: boolean): void {
    this.sliding = sliding;
  }

  private onSliderStart(slide: any): void {
    this.setSliding(true);
  }

  private onSlideEnd(slide: any): void {
    this.setSliding(false);
  }
}
</script>

测试:

import { shallowMount } from '@vue/test-utils';
import Slider from '@/components/Header.vue';

describe('Slider', () => {
  const wrapper = shallowMount(Slider);

  it('check Slider is a Vue Instance', () => {
    expect(wrapper.isVueInstance()).toBeTruthy();
  });

  it('setSlide is func', () => {
    expect(typeof wrapper.vm.setSlide).toBe('function')
  })
});

现在我想进行测试,但是方法setSlide,setSliding在包装器中不可用:(

2 个答案:

答案 0 :(得分:2)

尝试一下:

import YourComponentHere from "@/components/YourComponentHere";
import { shallowMount, Wrapper } from "@vue/test-utils";

describe("test", () => {
  const wrapper: Wrapper<YourComponentHere & { [key: string]: any }>;
  it("does something", () => {
    expect(wrapper.vm.someThingWhatever).toBe(true);
  });
});

这里的好处是您不需要每次使用wrapper.vm时都将any强制转换为wrapper.vm

答案 1 :(得分:1)

似乎您必须将wrapper.vm强制转换为any,以使TypeScript不要抱怨:

it('setSlide is func', () => {
  expect(typeof (wrapper.vm as any).setSlide).toBe('function')
})

或在测试顶部:

const wrapper: any = shallowMount(Slider);

来源:https://github.com/vuejs/vue-test-utils/issues/255#issuecomment-433312728