【问题标题】:[Vue warn]: Unknown custom element: <nuxt-link> - When running jest unit tests[Vue 警告]:未知的自定义元素:<nuxt-link> - 运行 jest 单元测试时
【发布时间】:2018-09-14 21:00:20
【问题描述】:

问题

我正在使用带有路由的 nuxt 1.4 使用 Jest 进行单元测试。我的应用程序不会抛出错误,而且似乎运行良好。但是,当运行我的单元测试 npm run unit(它运行 jest)时,它会在终端中引发错误:[Vue warn]: Unknown custom element: &lt;nuxt-link&gt; - did you register the component correctly? For recursive components, make sure to provide the "name" option.

预期

我希望它不会抛出此错误,因为我的应用程序正在运行。

文件

package.json:

{
  "name": "vue-starter",
  "version": "1.0.0",
  "description": "Nuxt.js project",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
    "precommit": "npm run lint",
    "test": "npm run lint && npm run unit",
    "unit": "jest",
    "unit:report": "jest --coverage"
  },
  "dependencies": {
    "babel-jest": "^22.4.1",
    "jest-serializer-vue": "^1.0.0",
    "node-sass": "^4.7.2",
    "npm": "^5.7.1",
    "nuxt": "^1.0.0",
    "sass-loader": "^6.0.7",
    "vue-jest": "^2.1.1"
  },
  "devDependencies": {
    "@vue/test-utils": "^1.0.0-beta.12",
    "babel-eslint": "^8.2.1",
    "eslint": "^4.15.0",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-loader": "^1.7.1",
    "eslint-plugin-vue": "^4.0.0",
    "jest": "^22.4.2"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  "jest": {
    "moduleFileExtensions": [
      "js",
      "vue"
    ],
    "transform": {
      "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
      ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
    },
    "snapshotSerializers": [
      "<rootDir>/node_modules/jest-serializer-vue"
    ]
  }
}

我测试的组件:

<template>
  <div>
    <nuxt-link class="name" :to="{ path: `entity/${item.id}`, params: { id: item.id }}">{{item.name}}</nuxt-link>
    <button class="connect" @click="connect">{{ btnText }}</button>
  </div>
</template>

<script>
  // import nuxtLink from '../.nuxt/components/nuxt-link';

  const connectionStatusMap = [
    'Connect',
    'Connected',
    'Pending',
    'Cancel',
  ];

  export default {
    /*components: {
      'nuxt-link': nuxtLink,
    },*/
    props: {
      item: {
        type: Object
      }
    },
    ...
  }
</script>

我的测试脚本:

import TestItem from '../components/TestItem';
import { shallow, mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import VueRouter from 'vue-router';

const localVue = createLocalVue()

localVue.use(Vuex)
localVue.use(VueRouter)

...
it(`should show the entity`, () => {
    const wrapper = mount(TestItem, {
      propsData: { item },
      localVue,
      store,
      // stubs: ['nuxt-link'],
    })
    expect(wrapper.find('.name').text()).toBe(item.name);
  });

  it(`should show allow me to connect if I'm not yet connected`, () => {
    const wrapper = shallow(TestItem, {
      propsData: { item },
      localVue,
      store,
      stubs: ['nuxt-link'],
    })
    expect(wrapper.find('.connect').text()).toBe('Connect');
  });
  ...

我试过了

我尝试创建一个 localVue 并按照 in this github comment 的建议对组件进行存根 我也试过shallow/mount,但这似乎也不起作用。

【问题讨论】:

    标签: vue.js jestjs vue-router nuxt.js vue-test-utils


    【解决方案1】:
    ...
    import NuxtLink from '../.nuxt/components/nuxt-link.js'
    
    ...
    TestItem.components = TestItem.components || {};
    TestItem.components.NuxtLink = NuxtLink;
    const wrapper = shallow(TestItem, {
        ...
    });
    ...
    

    【讨论】:

    • 感谢您的回复。我现在收到此错误 console.error node_modules/vue/dist/vue.runtime.common.js:589 [Vue warn]: Unknown custom element: &lt;router-link&gt; - did you register the component correctly? For recursive components, make sure to provide the "name" option. (found in &lt;Anonymous&gt;) 但我的应用程序中没有任何 router-link 元素,只有 nuxt-link
    • @Anima-t3d 你找到解决“路由器链接”错误的方法了吗?我有完全相同的问题。
    • @Oldenborg 我还没有时间尝试解决方案。但很高兴你找到了你的。
    【解决方案2】:

    致任何获得Unknow custom element: &lt;router-link&gt;的人

    我的问题是,我在创建组件时使用了mount 而不是shallow

    浅用法:

    与 mount 一样,它创建一个 Wrapper,其中包含已安装的和 渲染 Vue 组件,但带有存根的子组件。

    来源:https://vue-test-utils.vuejs.org/en/api/shallow.html

    这是一个工作示例

    import { shallow } from '@vue/test-utils';                               
    import ContentCard from '../../components/ContentCard.vue';                                                                           
    import NuxtLink from '../../.nuxt/components/nuxt-link';                                                                              
    
    const createComponent = propsData => shallow(ContentCard, { propsData });                                                             
    
    describe('ContentCard', () => {                                                                                                       
      let component;                                                                                                                      
    
      beforeEach(() => {
        ContentCard.components = ContentCard.components || {};                                                                            
        ContentCard.components.NuxtLink = NuxtLink;                                                                                       
      });   
    
      describe('Properties', () => {
        it('has an imgSrc property', () => {                                                                                              
          component = createComponent({ imgSrc: 'X' });                                                                                   
          expect(component.props().imgSrc).toBe('X');                                                                                     
        });   
      });     
    });
    

    【讨论】:

      【解决方案3】:

      我在下面添加了几行代码以使其正常工作。

      1. 在您的测试文件中
      import NuxtLink from "path to nuxt-link.js"
      
      Mycomponent.components.NuxtLink = NuxtLink
      
      1. 在你的 jest conf 文件中
      transformIgnorePatterns: [
         "path to nuxt-link.js"
      ],
      

      或者您可以在挂载选项中添加以下行

      mount(Mycomponent, {stubs: ["nuxt-link"]})
      

      【讨论】:

        【解决方案4】:

        我设法使用这个workaround for Storybook 让它工作:

        import { mount, createLocalVue } from '@vue/test-utils'
        import Component from '@/components/Component.vue'
        
        const localVue = createLocalVue()
        
        localVue.component('nuxt-link', {
          props:   ['to'],
          template: '<a href="#"><slot>NuxtLink</slot></a>',
        })
        
        describe('Test Component', () => {
        
            const wrapper = mount(Component, {
              stubs: ['nuxt-link'],
              localVue
            })
        })
        
        

        【讨论】:

          【解决方案5】:

          这就是我摆脱烦人警告的方法:

          包括RouterLinkStub,例如:

          import { shallowMount, createLocalVue, RouterLinkStub } from '@vue/test-utils';
          

          将 NuxtLink 存根映射到 RouterLinkStub

          const wrapper = shallowMount(TestItem, {
            ...
            stubs: {
              NuxtLink: RouterLinkStub
            }
          })
          

          如果您正在检查 nuxt-link 文本或其他内容,请更改:

          const link = wrapper.find('nuxt-link');
          

          const link = wrapper.find(RouterLinkStub);
          

          https://onigra.github.io/blog/2018/03/19/vue-test-utils-router-link-stub/找到这个黄金

          好在你不需要懂日语也能阅读代码……

          【讨论】:

            【解决方案6】:

            我有:

            // path: ./test/jest.setup.js
            
            import Vue from 'vue'
            import VueTestUtils from '@vue/test-utils'
            
            // Mock Nuxt components
            VueTestUtils.config.stubs['nuxt-link'] = '<a><slot /></a>'
            VueTestUtils.config.stubs['no-ssr'] = '<span><slot /></span>'
            

            // path: ./jest.config.js
            
            module.exports = {
              // ... other stuff
              setupFilesAfterEnv: ['./test/jest.setup.js']
            }
            
            

            ...这解决了我在 nuxt 应用程序中的所有玩笑测试

            【讨论】:

              【解决方案7】:

              虽然提供的答案可能有效。我最终使用的是based on this guide

              const wrapper = mount(TestItem, {
                propsData: { item },
                localVue,
                store,
                stubs: {
                  NuxtLink: true,
                  // Any other component that you want stubbed
                },
              });
              

              【讨论】:

                【解决方案8】:
                // test/jestSetup.js
                
                import Vue from 'vue'
                import Vuetify from 'vuetify'
                import { config } from '@vue/test-utils'
                
                Vue.use(Vuetify)
                
                config.stubs.NuxtLink = { template: '<a><slot /></a>' }
                

                【讨论】:

                  猜你喜欢
                  • 2019-09-22
                  • 2018-02-06
                  • 2017-12-22
                  • 2020-03-28
                  • 2020-01-01
                  • 2019-12-14
                  • 2018-01-08
                  • 2021-07-29
                  • 2018-09-15
                  相关资源
                  最近更新 更多