diff --git a/meta.js b/meta.js index 1a79a95..bdf3b3e 100644 --- a/meta.js +++ b/meta.js @@ -77,7 +77,29 @@ module.exports = { }, "unit": { "type": "confirm", - "message": "Setup unit tests with Karma + Mocha?" + "message": "Set up unit tests" + }, + "runner": { + "when": "unit", + "type": "list", + "message": "Pick a test runner", + "choices": [ + { + name: 'Jest', + value: 'jest', + short: 'jest', + }, + { + name: 'Karma and Mocha', + value: 'karma', + short: 'karma', + }, + { + name: 'none (configure it yourself)', + value: 'noTest', + short: 'noTest', + } + ] }, "e2e": { "type": "confirm", @@ -89,7 +111,12 @@ module.exports = { ".eslintignore": "lint", "config/test.env.js": "unit || e2e", "test/unit/**/*": "unit", - "build/webpack.test.conf.js": "unit", + "build/webpack.test.conf.js": "unit && runner === 'karma'", + 'test/unit/index.js': "unit && runner === 'karma'", + 'test/unit/jest.conf.js': "unit && runner === 'jest'", + 'test/unit/karma.conf.js': "unit && runner === 'karma'", + 'test/unit/specs/index.js': "unit && runner === 'karma'", + 'test/unit/setup.js': "unit && runner === 'jest'", "test/e2e/**/*": "e2e", "src/router/**/*": "router" }, diff --git a/template/.babelrc b/template/.babelrc index 63826f6..cd05be8 100644 --- a/template/.babelrc +++ b/template/.babelrc @@ -8,11 +8,12 @@ }], "stage-2" ], - "plugins": ["transform-runtime"], + "plugins": ["transform-runtime"]{{#if_or unit e2e}}, "env": { "test": { - "presets": ["env", "stage-2"], - "plugins": [ "istanbul" ] + "presets": ["env", "stage-2"]{{#if_eq runner "karma"}}, + "plugins": ["istanbul"]{{/if_eq}}{{#if_eq runner "jest"}}, + "plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"]{{/if_eq}} } - } + }{{/if_or}} } diff --git a/template/package.json b/template/package.json index 255fc2c..912bd11 100644 --- a/template/package.json +++ b/template/package.json @@ -7,11 +7,22 @@ "scripts": { "dev": "node build/dev-server.js", "start": "node build/dev-server.js", - "build": "node build/build.js"{{#unit}}, - "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run"{{/unit}}{{#e2e}}, - "e2e": "node test/e2e/runner.js"{{/e2e}}{{#if_or unit e2e}}, - "test": "{{#unit}}npm run unit{{/unit}}{{#unit}}{{#e2e}} && {{/e2e}}{{/unit}}{{#e2e}}npm run e2e{{/e2e}}"{{/if_or}}{{#lint}}, - "lint": "eslint --ext .js,.vue src{{#unit}} test/unit/specs{{/unit}}{{#e2e}} test/e2e/specs{{/e2e}}"{{/lint}} + {{#if_eq runner "jest"}} + "unit": "jest --config test/unit/jest.conf.js --coverage", + {{/if_eq}} + {{#if_eq runner "karma"}} + "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", + {{/if_eq}} + {{#e2e}} + "e2e": "node test/e2e/runner.js", + {{/e2e}} + {{#if_or unit e2e}} + "test": "{{#unit}}npm run unit{{/unit}}{{#unit}}{{#e2e}} && {{/e2e}}{{/unit}}{{#e2e}}npm run e2e{{/e2e}}", + {{/if_or}} + {{#lint}} + "lint": "eslint --ext .js,.vue src{{#unit}} test/unit{{/unit}}{{#e2e}} test/e2e/specs{{/e2e}}", + {{/lint}} + "build": "node build/build.js" }, "dependencies": { "vue": "^2.5.2"{{#router}}, @@ -59,7 +70,16 @@ "html-webpack-plugin": "^2.30.1", "http-proxy-middleware": "^0.17.4", "webpack-bundle-analyzer": "^2.9.0", - {{#unit}} + {{#if_eq runner "jest"}} + "babel-jest": "^21.0.2", + "babel-plugin-dynamic-import-node": "^1.2.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "jest": "^22.0.4", + "jest-serializer-vue": "^0.3.0", + "vue-jest": "^1.0.2", + "jest-transform-stub": "^1.0.0", + {{/if_eq}} + {{#if_eq runner "karma"}} "cross-env": "^5.0.5", "karma": "^1.7.1", "karma-coverage": "^1.1.1", @@ -77,7 +97,7 @@ "inject-loader": "^3.0.1", "babel-plugin-istanbul": "^4.1.5", "phantomjs-prebuilt": "^2.1.15", - {{/unit}} + {{/if_eq}} {{#e2e}} "chromedriver": "^2.33.1", "cross-spawn": "^5.1.0", diff --git a/template/test/unit/jest.conf.js b/template/test/unit/jest.conf.js new file mode 100644 index 0000000..ced908a --- /dev/null +++ b/template/test/unit/jest.conf.js @@ -0,0 +1,33 @@ +const path = require('path') + +module.exports = { + rootDir: path.resolve(__dirname, '../../'), + moduleFileExtensions: [ + 'js', + 'json', + 'vue' + ], + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + transform: { + '^.+\\.js$': '/node_modules/babel-jest', + '.*\\.(vue)$': '/node_modules/vue-jest', + '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub' + },{{#e2e}} + testPathIgnorePatterns: [ + '/test/e2e' + ],{{/e2e}} + snapshotSerializers: ['/node_modules/jest-serializer-vue'], + setupFiles: ['/test/unit/setup'], + mapCoverage: true, + coverageDirectory: '/test/unit/coverage', + collectCoverageFrom: [ + 'src/**/*.{js,vue}', + '!src/main.js', + {{#router}} + '!src/router/index.js', + {{/router}} + '!**/node_modules/**' + ] +} diff --git a/template/test/unit/setup.js b/template/test/unit/setup.js new file mode 100644 index 0000000..edbdbae --- /dev/null +++ b/template/test/unit/setup.js @@ -0,0 +1,3 @@ +import Vue from 'vue' + +Vue.config.productionTip = false diff --git a/template/test/unit/specs/Hello.spec.js b/template/test/unit/specs/Hello.spec.js index 081ef80..67a1b51 100644 --- a/template/test/unit/specs/Hello.spec.js +++ b/template/test/unit/specs/Hello.spec.js @@ -6,6 +6,6 @@ describe('Hello.vue', () => { const Constructor = Vue.extend(Hello){{#if_eq lintConfig "airbnb"}};{{/if_eq}} const vm = new Constructor().$mount(){{#if_eq lintConfig "airbnb"}};{{/if_eq}} expect(vm.$el.querySelector('.hello h1').textContent) - .to.equal('Welcome to Your Vue.js PWA'){{#if_eq lintConfig "airbnb"}};{{/if_eq}} + {{#if_eq runner "karma"}}.to.equal('Welcome to Your Vue.js PWA'){{/if_eq}}{{#if_eq runner "jest"}}.toEqual('Welcome to Your Vue.js PWA'){{/if_eq}}{{#if_eq lintConfig "airbnb"}};{{/if_eq}} }){{#if_eq lintConfig "airbnb"}};{{/if_eq}} }){{#if_eq lintConfig "airbnb"}};{{/if_eq}}