2017-09-11 2 views
2

Je tente d'ajouter la Fondation pour les sites à mon premier projet Vue.js qui est configuré avec la Vue CLI.test unitaire Karma Vue.js + Fondation

Le site fonctionne cependant la suite de tests de l'unité Karma + PhantomJS émet cette erreur:

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 

Je crois que cela est lié à webpack/babel et le chargement du module ES de la Fondation. Je ne sais pas trop comment diagnostiquer et résoudre le problème.

Voici un aperçu des changements de code que j'ai fait ...

main.js

import jQuery from 'jquery' 
window.jQuery = jQuery 
window.$ = jQuery 

import Foundation from 'foundation-sites' 
window.Foundation = Foundation 

Hello.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> 

test/unit /index.js

import Vue from 'vue' 
import Foundation from 'foundation-sites' 
window.Foundation = Foundation 

// ... auto-generated unit tests 

test/unit/karma.conf.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' } 
     ] 
    } 
    }) 
} 

webpack.base.conf.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]') 
     } 
     } 
    ] 
    } 
} 

Répondre

0

La solution que j'ai trouvée est de charger Foundation via Babel.

webpack.base.conf.js

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

La principale raison de cela est expliqué dans le fait Foundation docs:

Our JavaScript uses some features of ECMAScript 2015. If you use Foundation with a build system, you'll need to compile our code to ES5. We use Babel in our templates to do this. Babel has plugins for every build system imaginable, so integrating it into an existing setup is easy.

Les docs Fondation vont à recommander, y compris et le réglage de la babel "presets": ["es2015"] Cependant, la Vue CLI est déjà légèrement différente.

Vue CLI utilise déjà les plugins babel-preset-env et babel-preset-stage2 que j'ai appris depuis lors et qui s'occupe de la transpiration ES2015> ES5. Vue CLI configure le webpack avec plusieurs chargeurs, il semble donc nécessaire d'ajouter Foundation à la configuration babel-loader.

Actuellement, j'importe Importation Foundation et l'ajoute au window global dans le point d'entrée main.js de Vue. Ensuite, je verrai probablement si je peux l'exposer en utilisant le Expose loader.

0

Je devine que vous transpiling avec babel et définissant ceci dans votre config webpack. Il serait logique que cette transpiration ne se produise pas car elle semble échouer sur le fond de la chaîne interpolée qui ne serait pas disponible dans es5.

Supposons que vous avez déjà un karma.conf.js défini, vous aurez juste besoin d'ajouter votre config webpack à elle. Peut-être bien de poster votre karma.conf.js si vous en avez un.

J'utilise les éléments suivants:

// 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: {}, 
    }, 
    }) 
} 

et:

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

et ont les éléments suivants dans mes paquets scripts pour le fonctionnement:

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

******* MISE À JOUR *****

Je ne sais pas ho w vous manipulez vos presets de babel, vous utilisez peut-être le a babelrc et ce n'est pas trouvé (ou d'une manière qui n'est pas dans votre base de configuration webpack de toute façon) mais vous pourriez essayer d'ajouter quelque chose comme:

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

à votre config webpack dans la construction/webpack.test.conf ... difficile de dire que comme je ne sais pas ce que vous avez dans votre test.conf

+0

Le Vue Cli met en place des configurations assez bien modularisées de karma et de webpack. Je viens d'ajouter la configuration de test de karma qui ressemble virtuellement à l'exemple que vous avez posté. Je remarque que la configuration webpack donne des alias pour une source Vue 'esm'. Je ne suis pas sûr si je devrais faire la même chose pour Foundation. Ajout de la configuration du test karma et de la configuration webpack-base à la question. –

+1

Je viens d'ajouter une fondation à une application vue J'ai mis en place le karma et vous obtenez la même erreur que vous. Ce n'est donc pas quelque chose de spécifique à votre configuration. J'ai d'autres importations ES6 fonctionne bien –

0

J'ai eu un problème similaire avec paquet différent, ce que j'ai trouvé est que le code de couverture est responsable de cela.

Sous test/unit index.js ouvert et commenter ces 2 lignes:

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

Cela devrait résoudre le problème.

+0

Merci pour la suggestion. Malheureusement, je vois toujours la même erreur avec ces lignes commentées. –