代码之家  ›  专栏  ›  技术社区  ›  Dwight Gunning

Karma单元测试Vue。js+基础

  •  2
  • Dwight Gunning  · 技术社区  · 7 年前

    我正试图为我的第一个Vue添加网站基础。使用Vue CLI设置的js项目。

    然而,网站运行时,Karma+Phantomjs单元测试套件发出以下错误:

    PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
      SyntaxError: Invalid character: '`'
      at webpack:///~/foundation-sites/js/foundation.util.core.js:24:0 <- index.js:10362
    

    下面是我所做代码更改的概述。。。

    import jQuery from 'jquery'
    window.jQuery = jQuery
    window.$ = jQuery
    
    import Foundation from 'foundation-sites'
    window.Foundation = Foundation
    

    你好vue

    <template> ... </template>
    
     <script>
     export default {
       name: 'hello',
       mounted () {
         this.dropdownMenu = new Foundation.DropdownMenu($('#dropdown-menu'), {
           // These options can be declarative using the data attributes
           hoverDelay: 300
         })
       },
       data () {
         return {
           msg: 'Welcome to Your Vue.js App'
         }
       },
       destroyed () {
         this.dropdownMenu.destroy()
       }
     }
     </script>
    

    import Vue from 'vue'
    import Foundation from 'foundation-sites'
    window.Foundation = Foundation
    
    // ... auto-generated unit tests
    

    测试/单元/业力。配置js

    // This is a karma config file. For more details see
    //   http://karma-runner.github.io/0.13/config/configuration-file.html
    // we are also using it with karma-webpack
    //   https://github.com/webpack/karma-webpack
    
    var webpackConfig = require('../../build/webpack.test.conf')
    
    module.exports = function (config) {
      config.set({
        // to run in additional browsers:
        // 1. install corresponding karma launcher
        //    http://karma-runner.github.io/0.13/config/browsers.html
        // 2. add it to the `browsers` array below.
        browsers: ['PhantomJS'],
        frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'],
        reporters: ['spec', 'coverage'],
        files: ['./index.js'],
        preprocessors: {
          './index.js': ['webpack', 'sourcemap']
        },
        webpack: webpackConfig,
        webpackMiddleware: {
          noInfo: true
        },
        coverageReporter: {
          dir: './coverage',
          reporters: [
            { type: 'lcov', subdir: '.' },
            { type: 'text-summary' }
          ]
        }
      })
    }
    

    网页包。基础配置js

    var path = require('path')
    var utils = require('./utils')
    var config = require('../config')
    var vueLoaderConfig = require('./vue-loader.conf')
    
    function resolve (dir) {
      return path.join(__dirname, '..', dir)
    }
    
    module.exports = {
      entry: {
        app: './src/main.js'
      },
      output: {
        path: config.build.assetsRoot,
        filename: '[name].js',
        publicPath: process.env.NODE_ENV === 'production'
          ? config.build.assetsPublicPath
          : config.dev.assetsPublicPath
      },
      resolve: {
        extensions: ['.js', '.vue', '.json'],
        alias: {
          'vue$': 'vue/dist/vue.esm.js',
          '@': resolve('src'),
        }
      },
      module: {
        rules: [
          {
            test: /\.(js|vue)$/,
            loader: 'eslint-loader',
            enforce: 'pre',
            include: [resolve('src'), resolve('test')],
            options: {
              formatter: require('eslint-friendly-formatter')
            }
          },
          {
            test: /\.vue$/,
            loader: 'vue-loader',
            options: vueLoaderConfig
          },
          {
            test: /\.js$/,
            loader: 'babel-loader',
            include: [resolve('src'), resolve('test')]
          },
          {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: 'url-loader',
            options: {
              limit: 10000,
              name: utils.assetsPath('img/[name].[hash:7].[ext]')
            }
          },
          {
            test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
            loader: 'url-loader',
            options: {
              limit: 10000,
              name: utils.assetsPath('media/[name].[hash:7].[ext]')
            }
          },
          {
            test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
            loader: 'url-loader',
            options: {
              limit: 10000,
              name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
            }
          }
        ]
      }
    }
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   Tomer    7 年前

    我在另一个包中遇到了类似的问题,我发现是覆盖代码造成的。

    测试中/单元开放索引。js并评论这两行:

    const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/)
    srcContext.keys().forEach(srcContext)
    

    这应该可以解决问题。

        2
  •  0
  •   Purple Hexagon    7 年前

    假设你已经有了业力。定义了conf.js,您可能只需要将您的网页包配置添加到其中。也许张贴你的因果报应是件好事。conf.js(如果有)。

    我使用以下方法:

    // karma.conf.js
    const webpackConfig = require('./build/webpack.base')
    
    delete webpackConfig.entry
    
    webpackConfig.resolve.alias.vue = 'vue/dist/vue.js'
    
    module.exports = function karmaConfig(config) {
      config.set({
        browsers: ['PhantomJS'],
        frameworks: ['mocha', 'chai'],
        // this is the entry file for all our tests.
        files: ['ui-tests/index.js'],
        // we will pass the entry file to webpack for bundling.
        preprocessors: {
          'ui-tests/index.js': ['webpack'],
        },
        // use the webpack config
        webpack: webpackConfig,
        // avoid walls of useless text
        webpackMiddleware: {
          noInfo: true,
        },
        singleRun: true,
        junitReporter: {
          outputDir: '../../build/logs/',
          outputFile: 'junit-js-ui-test-report.xml',
          suite: 'review',
          useBrowserName: false,
          nameFormatter: undefined,
          classNameFormatter: undefined,
          properties: {},
        },
      })
    }
    

    // ui-tests/index.js
    const tests = require.context('..', true, /ui-tests\/.*\.spec$/)
    tests.keys().forEach(tests)
    

    并在我的软件包中包含以下运行脚本:

    ./node_modules/.bin/karma start karma.conf.js
    

    不确定你是如何处理你的babel预设的,也许你正在使用一个babelrc,但这并没有被找到(或者以某种方式,它不在你的基本网页配置中),但你可以尝试添加一些类似的内容,但符合你的要求:

    babel: {
      babelrc: false,
      presets: [
        ['es2015' {modules: false}],
        'stage-1'
     ]
    },
    

    在build/webpack中添加到您的网页包配置。测验配置。。。虽然很难说,因为我不知道你的测试中有什么。形态

        3
  •  0
  •   Dwight Gunning    7 年前

    我找到的解决方案是通过Babel加载Foundation。

    {
      test: /\.js$/,
      loader: 'babel-loader',
      include: [
        resolve('src'),
        resolve('test'),
        resolve('node_modules/foundation-sites') // Added this line.
      ]
    },
    

    Foundation docs

    我们的JavaScript使用了ECMAScript 2015的一些功能。如果将Foundation用于构建系统,则需要将我们的代码编译为ES5。我们在模板中使用Babel来实现这一点。Babel为每个可以想象的构建系统都提供了插件,因此将其集成到现有设置中是很容易的。

    基金会文件继续建议包括和设置巴别塔 "presets": ["es2015"]

    Vue CLI已使用 babel-preset-env babel-preset-stage2 从那以后,我学习的插件负责ES2015>ES5脱毛。Vue CLI使用多个加载程序设置网页包,因此似乎有必要为 babel-loader 配置。

    window 从Vue内部 main.js 入口点。接下来,我可能会看看是否可以使用 Expose loader .