如何避免在每个测试文件中导入组件所需的所有内容?

Posted

技术标签:

【中文标题】如何避免在每个测试文件中导入组件所需的所有内容?【英文标题】:How to avoid import everything that the component needs in each test file? 【发布时间】:2020-02-28 00:41:06 【问题描述】:

在我的笑话测试中,我需要导入被测试组件需要工作的所有内容(我在我的应用程序的main.js 中执行此操作)。由于我有多个测试文件,我需要在每个文件中“重新导入”它。有没有办法将它全部导入一个文件,然后只导入这个文件?

import Component from '@/views/input-something'
import mount, shallowMount from '@vue/test-utils'
import FontAwesomeIcon from '@fortawesome/vue-fontawesome'
import library from '@fortawesome/fontawesome-svg-core'
import fas from '@fortawesome/free-solid-svg-icons'
import 'bootstrap-vue/dist/bootstrap-vue.css'
import 'bootstrap/dist/css/bootstrap.css'
import BootstrapVue from 'bootstrap-vue'
import 'vue-select/dist/vue-select.css'
import Vuelidate from 'vuelidate'
import Vue from 'vue'
import './helpers/multi-ref-test-runner'

Vue.component('font-awesome-icon', FontAwesomeIcon)
Vue.use(BootstrapVue)
Vue.use(Vuelidate)
library.add(fas)

// I wish to write everything above in a single file

window.confirm = function()  return false; 

describe('input-something', () => 
  let wrapper;
  beforeEach(() => 
    wrapper = mount(Component, ...);
  );

  it('it renders', () => );
);

我希望在一个文件中导入我需要的所有内容,例如 helper.js

然后在我的测试文件中我会做类似的事情

import 'test-helpers/helper';

describe('input-something', () => ...)

编辑 1

一段时间后,我能够以这种方式导入所有我需要的东西

/* imports.js */
import Component from '@/components/something'
import  mount  from '@vue/test-utils'

export  Component, mount 
/* my-test.js */
import  Component, mount  from './imports.js'

并将这一行添加到我的 .babelrc 中(以便能够使用 jest)

"plugins": ["@babel/plugin-syntax-dynamic-import"]

然后我可以使用我导入的所有属性。 虽然它是以这种方式工作的,但我想使用这些属性(组件、挂载...)而不必隐式导入每个属性。 有办法吗?

【问题讨论】:

【参考方案1】:
    创建一个单独的js文件 在那里导入组件或插件或任何你想要的东西 将该文件导入 main.js 文件中

例如: 这是我单独的 reuseableComponets.js

// I include components and plugins here
...
import Component from '@/views/input-something'
import mount, shallowMount from '@vue/test-utils'
import FontAwesomeIcon from '@fortawesome/vue-fontawesome'
...

现在在 app.js 中

import('path to reuseableComponets.js')

就是这样。

【讨论】:

这样做,我得到这个错误:SyntaxError: /home/cassio/projects/forms-frontend/src/main.js: Support for the experimental syntax 'dynamicImport' isn't currently enabled (1:1): > 1 | import ('./test-imports') 尝试使用require('...') 导入该文件 使用import '...'require('...') 我收到未定义变量的错误。我也尝试过使用module.exports = ...export default ...,但没有成功。【参考方案2】:

jest.config.js 中使用setupFilesAfterEnv 来指向设置测试的脚本。该文件将在您的测试之前自动调用,因此您不必导入它。

例如,您可以将您提到的设置代码移动到名为my-setup.js 的文件中,然后按如下方式配置 Jest:

// jest.config.js
module.exports = 
  setupFilesAfterEnv: ['./my-setup.js'],

【讨论】:

以上是关于如何避免在每个测试文件中导入组件所需的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

什么是从同一个文件中导入多个组件的正确方法,而不是导入每个组件

如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?

如何创建您的第一个 Angular Reactive Form

如何将 BootstrapVue 在 Nuxt.js 中使用 Purgecss 所需的所有内容列入白名单

无法在文件中导入 FBSDKWebDialog

如何使用 tlibimp 在 BCB5 中导入 ActiveX 控件?