我有一个或多或少的香草Laravel + Vue.js应用程序,我正在尝试做一些JS testing with Karma and Jasmine。如果我在我的测试中尝试使用() => {}
样式函数或const
这样的关键字,则会因意外令牌错误而失败,但是,使用{{{我>没有问题1}}关键字,我能够毫无问题地转换和使用import
文件。
像
这样的微不足道的断言.vue
似乎工作正常(见最后一行)
expect(true).toBe(true);
然后,如果我向我的测试函数添加一个简单的$ ./node_modules/karma/bin/karma start
22 11 2016 11:09:23.250:INFO [karma]: Karma v1.3.0 server started at http://localhost:9876/
22 11 2016 11:09:23.254:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
22 11 2016 11:09:23.263:INFO [launcher]: Starting browser PhantomJS
22 11 2016 11:09:24.025:INFO [PhantomJS 2.1.1 (Mac OS X 0.0.0)]: Connected on socket /#U1dCZ7i3UtsC-M3_AAAA with id 84458811
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 1 of 1 SUCCESS (0.004 secs / 0.002 secs)
声明
const
我收到错误:
const myVar = 1
expect(true).toBe(true);
相反,如果我尝试导致语法错误
$ ./node_modules/karma/bin/karma start
22 11 2016 11:10:00.741:INFO [karma]: Karma v1.3.0 server started at http://localhost:9876/
22 11 2016 11:10:00.745:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
22 11 2016 11:10:00.752:INFO [launcher]: Starting browser PhantomJS
22 11 2016 11:10:01.659:INFO [PhantomJS 2.1.1 (Mac OS X 0.0.0)]: Connected on socket /#Gwh8ywcLStrKf-ljAAAA with id 78654911
PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
SyntaxError: Unexpected token 'const'
at tests/unit/Example.spec.js:165
然后Babel抱怨(在第一行,在Karma或PhantomJS启动之前)
const = 1 // syntax error
expect(true).toBe(true);
这似乎意味着Babel正在解析/转换22 11 2016 11:07:00.079:ERROR [preprocessor.babel]: /Users/crcarter/Software/CropPlanning/cps-php/resources/assets/js/tests/unit/Example.spec.js: Unexpected token (8:15)
at /Users/crcarter/Software/CropPlanning/cps-php/resources/assets/js/tests/unit/Example.spec.js
22 11 2016 11:07:00.090:INFO [karma]: Karma v1.3.0 server started at http://localhost:9876/
22 11 2016 11:07:00.091:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
22 11 2016 11:07:00.101:INFO [launcher]: Starting browser PhantomJS
22 11 2016 11:07:00.986:INFO [PhantomJS 2.1.1 (Mac OS X 0.0.0)]: Connected on socket /#9Y6QLVxtJ57qRrgDAAAA with id 56249014
PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
You need to include some adapter that implements __karma__.start method!
文件,但是转换后的版本没有正确地传递给浏览器,即使Example.spec.js
文件似乎已被传递正常。
如果能够在我的测试中使用Example.vue
和const
这样的内容,我该怎么做?谢谢。
以下是相关文件:
() => {}
resources/assets/js/components/Example.vue
resources/assets/js/tests/unit/Example.spec.js
karma.conf.js
package.json
// Example.vue
<template>
<div class="container">
</div>
</template>
<script>
export default {
mounted() {
console.log('Component ready.')
},
data() {
return { input: '# Hello!' }
}
}
</script>
// Example.spec.js
import Example from '../../components/Example.vue';
describe('Example', function () {
it('should set correct default data', function () {
const myVar = 1
// trivial assertions
expect(true).toBe(true);
});
});
// karma.conf.js
var path = require('path')
var basePath = './resources/assets/js/';
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
port: 9876,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['PhantomJS'],
singleRun: true,
basePath: basePath,
webpack: {
resolve: {
extensions: ['', '.js', '.vue'],
fallback: [path.join(__dirname, 'node_modules')],
},
resolveLoader: {
fallback: [path.join(__dirname, 'node_modules')]
},
module: {
loaders: [
{ test: /\.vue$/, loader: 'vue' },
{ test: /\.js$/, loader: 'babel',
include: basePath,
}
]
}
},
webpackMiddleware: {
noInfo: true,
stats: 'errors-only'
},
files: [
{ pattern: 'tests/**/*.spec.js', watched: false },
],
exclude: [],
preprocessors: {
'app.js': ['webpack', 'babel'],
'tests/**/*.spec.js': [ 'babel', 'webpack' ]
},
})
}
package.json
答案 0 :(得分:4)
@craig_h和@PanJunjie的评论让我看到karma-babel-preprocessor
的配置,这导致我进入karma-webpack
的配置。我还不确定导致原始问题的原因,但看起来我的Karma配置文件不正确或不完整,并且无声地失败。我通过
babel-loader
和babel-preset-es2015
个软件包
yarn add babel-loader babel-preset-es2015
然后我重新整理并清理了我的karma.conf.js
:
module.exports = function(config) {
config.set({
singleRun: false, // false => watch for changes and rerun tests
autoWatch: true, // enable / disable watching files & then run tests
frameworks: ['jasmine'],
browsers: ['PhantomJS'],
// Options: LOG_DISABLE, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG
logLevel: config.LOG_INFO,
basePath: './resources/assets/js/',
files: [
{ pattern: 'tests/**/*.spec.js', watched: false },
],
// how to process files before serving them to the browser for testing
preprocessors: {
'app.js': ['webpack'],
'tests/**/*.spec.js': ['webpack'],
},
webpack: {
module: {
loaders: [
{ test: /\.vue$/, loader: 'vue' },
{ test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: { presets: ['es2015'] }
}
]
},
// make sure to use the stand-alone version of Vue
resolve: {
alias: {vue: 'vue/dist/vue.js'}
}
},
webpackMiddleware: {
noInfo: true,
stats: 'errors-only'
}
});
};
我的package.json
现在看起来像这样:
{
"private": true,
"scripts": {
"prod": "gulp --production",
"dev": "gulp watch"
},
"devDependencies": {
"bootstrap-sass": "^3.3.7",
"gulp": "^3.9.1",
"jquery": "^3.1.0",
"laravel-elixir": "^6.0.0-11",
"laravel-elixir-vue-2": "^0.2.0",
"laravel-elixir-webpack-official": "^1.0.2",
"lodash": "^4.16.2",
"vue": "^2.0.1",
"vue-resource": "^1.0.3"
},
"dependencies": {
"babel-loader": "^6.2.8",
"babel-preset-es2015": "^6.18.0",
"jasmine-core": "^2.5.2",
"karma": "^1.3.0",
"karma-babel-preprocessor": "^6.0.1",
"karma-chrome-launcher": "^2.0.0",
"karma-firefox-launcher": "^1.0.0",
"karma-jasmine": "^1.0.2",
"karma-phantomjs-launcher": "^1.0.2",
"karma-webpack": "^1.8.0"
}
}
通过所有这些,我现在可以使用所有ES2015善良,例如const
和() => {}
。很抱歉回答我自己的问题,但我希望这可以帮助遇到类似问题的其他人。
答案 1 :(得分:1)
我有类似的问题(虽然不完全相同;你的配置非常具体)。我还使用了Vue,karma,webpack和phantomjs(在vue-Webpack模板中配置)。
但是,我的问题是我在帮助文件中定义了const
,该文件已导入我的应用程序。当我在该文件中将const
更改为var
时,测试就能够运行了。(const
是否已在其他已存在的文件中使用并不重要src
目录)。
当我将此帮助文件移动到我的src
文件夹或其子目录中时,此问题已得到解决。我不知道为什么这样可以解决问题,但是我猜测babel没有配置为在根文件夹中工作,而只是指向{{1} }文件夹。
希望这对其他人也有帮助。
答案 2 :(得分:1)
除了RyanQuey的评论:他是对的。默认的Vue + Webpack CLI设置仅包括babel-loader要处理的某些上下文。查看build / webpack.base.conf.js,然后查看JS文件的模块规则。您可以看到只包含src,test和node_modules / webpack-dev-server / client路径(在撰写本文时)。