VueJS - 使用vue-test-utils进行单元测试会产生错误 - TypeError:_vm。$ t不是函数

时间:2018-02-14 14:51:33

标签: vue.js sass jestjs babel-jest vue-test-utils

相对较新的Vuejs并测试其组件。使用vue-test-utils和jest进行测试。获得以下错误 test log

.vue文件由模板,组件和样式组成。以下是SignupLayout.vue中获取错误的部分 -

<style lang="sass">
@import '../stylesheets/colors'
html[path="/signup"], html[path="/login"]
  height: 100%
  background-image: url("../assets/background.jpg")
  background-size: cover
  background-position: center
  background-repeat: no-repeat
  overflow: hidden

  #signup-layout
    #change-language-button
      .lang-menu
        color: $alto

</style>

测试文件 -

import Vue from 'vue';
import Vuex from 'vuex'
import SignupLayout from '../src/components/SignupLayout.vue';
import { mount, shallow, createLocalVue } from '@vue/test-utils';

const localVue = createLocalVue()

localVue.use(Vuex)

jest.resetModules()

describe('Signup.test.js', () => {
    let cmp
    let actions
    let store
    let getters
    let state

    beforeEach(() => {


        state = {
            email: 'abc@gmail.com'
        }
 
        getters = {
            CURRENT_USER_EMAIL: state => state.email
        }

        store = new Vuex.Store({
            getters
        })


    })

    it('has received ["Login"] as the title property', () => {
        cmp = shallow(SignupLayout, {
            store,
            localVue,
            propsData: {
                title: ['Login']
            },
            data: {
                email: 'abc@dsf.com'
            }
        })
        cmp.update()
        expect(cmp.vm.title).toEqual(['Login'])
    })


})

对于与sass有什么关系感到困惑。任何帮助,将不胜感激。现在坚持了一段时间。 如果需要更多细节,请告诉我。提前致谢

3 个答案:

答案 0 :(得分:4)

const $t = () => {}

shallow(Component, {
 mocks:{ $t }
})

这样你就不必加载整个i18n库。您甚至可以使用Sinon监视函数,如果使用Jest,则可以jest.fn()

答案 1 :(得分:2)

错误不在<style>标记中,因为Jest将编译您的Vue组件并提取JS代码。所以你现在可以忽略行错误(我不知道如何解决它)。

但根据您的错误消息,问题似乎与vue i18n的使用有关,并且您在测试文件中声明Vue组件时错过了它。尝试将这些行添加到测试文件中:

import i18n from 'path-to-your-i18n-file'

// ...

cmp = shallow(SignupLayout, {
  store,
  localVue,
  propsData: {
      title: ['Login']
  },
  data: {
      email: 'abc@dsf.com'
  },
  i18n // <- add the i18n object here
})

答案 2 :(得分:0)

模拟i18n库的另一种方法是在单独的js文件中对其进行模拟

AbstractNotificationPopUp

并将其添加到Jest配置中

import VueTestUtils from '@vue/test-utils';
VueTestUtils.config.mocks.$t = key => key;

因此,如果您有更多带有资源导入的组件,则无需单独对其进行模拟。