feat(fes-cli): 支持单元测试

添加fes test:unit命令,当运行命令时,执行项目test目录下的测试脚本
This commit is contained in:
harrywan 2020-10-27 12:47:21 +08:00
parent 91096b29dd
commit bf07558130
11 changed files with 1868 additions and 59 deletions

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
/packages/fes-template/test

View File

@ -59,6 +59,23 @@ commander.command('build')
build(config);
});
commander
.command('test:unit')
.description('单元测试')
.option('-w, --watch', 'run in watch mode')
.option('-g, --grep', 'only run tests matching <pattern>')
.option('-s, --slow', "'slow' test threshold in milliseconds")
.option('-t, --timeout', 'timeout threshold in milliseconds')
.option('-b, --bail', 'bail after first test failure')
.option('-r, --require', 'require the given module before running tests')
.option('--include', 'include the given module into test bundle')
.option('--inspect-brk', 'Enable inspector to debug the tests')
.action(() => {
const test = require('../build/tasks/test');
const config = generateConfig('build', commander.env || 'dev');
test(config, process.argv.slice(3));
});
commander.parse(process.argv);

View File

@ -0,0 +1,84 @@
const path = require('path');
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
const nodeExternals = require('webpack-node-externals');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const isCoverage = process.env.NODE_ENV === 'coverage';
const generateConfig = require('../helpers/config');
const configs = generateConfig();
const webpackConfig = {
mode: 'development',
output: {
path: configs.folders.PROJECT_DIST_DIR,
publicPath: '/dist/',
filename: '[name].js',
chunkFilename: '[id].js',
devtoolModuleFilenameTemplate: '[absolute-resource-path]',
devtoolFallbackModuleFilenameTemplate: '[absolute-resource-path]?[hash]'
},
resolve: {
extensions: ['.js', '.vue', '.fes', '.json'],
alias: {
projectRoot: configs.folders.PROJECT_DIR,
'@': path.resolve(configs.folders.PROJECT_DIR, 'src'),
'@@': path.resolve(configs.folders.FES_DIR, 'src'),
assets: path.resolve(configs.folders.PROJECT_DIR, './src/assets/'),
vue$: 'vue/dist/vue.esm.js'
},
modules: [
'node_modules',
path.join(configs.folders.CLI_DIR, 'node_modules'),
path.join(configs.folders.PROJECT_DIR, 'node_modules')
]
},
externals: [nodeExternals()],
module: {
rules: [].concat(
isCoverage
? {
test: /\.js$/,
include: path.resolve('packages'), // instrument only testing sources with Istanbul, after ts-loader runs
loader: 'istanbul-instrumenter-loader',
query: {
esModules: true
}
}
: [],
{
test: /\.(jsx?|babel|es6)$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel-loader'
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
compilerOptions: {
preserveWhitespace: false
},
optimizeSSR: false
}
},
{
test: /\.css$/,
loaders: ['style-loader', 'css-loader']
},
{
test: /\.(svg|otf|ttf|woff2?|eot|gif|png|jpe?g)(\?\S*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: path.posix.join('static', '[name].[hash:7].[ext]')
}
}
)
},
plugins: [new VueLoaderPlugin(), new ProgressBarPlugin()],
target: 'node',
devtool: 'inline-cheap-module-source-map'
};
module.exports = webpackConfig;

View File

@ -0,0 +1,4 @@
require('jsdom-global')();
// https://github.com/vuejs/vue-test-utils/issues/936
window.Date = Date;

View File

@ -0,0 +1,38 @@
const fs = require('fs-extra');
const execa = require('execa');
const path = require('path');
const log = require('../helpers/log');
module.exports = function (config, rawArgv) {
const testDir = path.join(config.folders.PROJECT_DIR, 'test');
if (fs.pathExistsSync(testDir)) {
const bin = require.resolve('mochapack/bin/mochapack');
const argv = [
// ...nodeArgs,
bin,
'--recursive',
'--require',
require.resolve('../helpers/setup.js'),
'--webpack-config',
require.resolve('../configs/webpack.test.config.js'),
...rawArgv,
`${testDir}/**/*.spec.js`
];
const child = execa('node', argv, {
cwd: config.folders.CLI_DIR,
encoding: 'utf8',
stdio: 'inherit'
});
child.on('error', (e) => {
log.error('[ERROR] test命令执行失败');
log.error(JSON.stringify(e));
});
child.on('exit', (code) => {
if (code !== 0) {
log.message(`[fes] mochapack进程退出code ${code}.`);
}
});
} else {
log.warn('[WRAN] 测试目录不存在请在项目根目录创建目录test');
}
};

File diff suppressed because it is too large Load Diff

View File

@ -40,6 +40,7 @@
"body-parser": "^1.5.2",
"cache-loader": "^4.1.0",
"case-sensitive-paths-webpack-plugin": "^2.2.0",
"progress-bar-webpack-plugin": "^2.1.0",
"chalk": "^4.1.0",
"chokidar": "^1.7.0",
"clean-webpack-plugin": "^3.0.0",
@ -49,7 +50,7 @@
"copy-webpack-plugin": "^5.0.4",
"cross-spawn": "^2.1.0",
"css-loader": "^3.1.0",
"execa": "^0.8.0",
"execa": "^4.0.3n",
"express": "^4.14.0",
"express-http-proxy": "^0.10.0",
"express-session": "^1.7.2",
@ -81,6 +82,10 @@
"require-dir": "^0.3.0",
"sass-loader": "^10.0.2",
"shelljs": "^0.5.3",
"jsdom": "^16.4.0",
"jsdom-global": "^3.0.2",
"mocha": "^7.2.0",
"mochapack": "^2.0.5",
"string-replace-loader": "^2.2.0",
"strip-indent": "^2.0.0",
"style-loader": "^1.0.0",
@ -99,6 +104,7 @@
"webpack-dev-middleware": "^3.7.2",
"webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^4.2.2",
"yargs": "^3.31.0"
"yargs": "^3.31.0",
"webpack-node-externals": "^2.5.2"
}
}

View File

@ -366,6 +366,17 @@
"integrity": "sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==",
"dev": true
},
"@vue/test-utils": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.1.0.tgz",
"integrity": "sha512-M+3jtVqNYIrvzO5gaxogre5a5+96h0hN/dXw+5Lj0t+dp6fAhYcUjpLrC9j9cEEkl2Rcuh/gKYRUmR5N4vcqPw==",
"dev": true,
"requires": {
"dom-event-types": "^1.0.0",
"lodash": "^4.17.15",
"pretty": "^2.0.0"
}
},
"@webank/eslint-config-webank": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/@webank/eslint-config-webank/-/eslint-config-webank-0.1.7.tgz",
@ -381,9 +392,9 @@
}
},
"@webank/fes-core": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@webank/fes-core/-/fes-core-0.2.4.tgz",
"integrity": "sha512-sBpNzpp5EJrsEh2fx8wQGtYiZdRG0eSWe9cr+LTCtou119zFZ3Ed9Bsth0mgLAx//Z57c0/FyxMsSsK3q2Lrmg==",
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@webank/fes-core/-/fes-core-0.3.0.tgz",
"integrity": "sha512-RNwq1R8MshqpkzC2lWIwrEBNnB33BdP0iplEflXNHA2xwx1ccMUfVkVJEv6LIGOHQCCHYNwemDnjsty0mhC1kA==",
"requires": {
"axios": "^0.16.2",
"lodash": "^4.17.15",
@ -394,14 +405,20 @@
}
},
"@webank/fes-ui": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@webank/fes-ui/-/fes-ui-0.2.4.tgz",
"integrity": "sha512-ovemdhoY1w65Op7RYnMnGv2IZkj+LD1cMxzyjyb48LhZaQj2ZkO3y8ViLUHVxAUpapEQ2qlCrd5y1IFs9bwefg==",
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@webank/fes-ui/-/fes-ui-0.3.0.tgz",
"integrity": "sha512-gTyPS+iABthjCKHKgdOxOfjyeK9WgKb6SK5YcayLCTQDpUPZ3Bb6ckZE9vA1Oiw3d/N1FztxicxKgoUTsgTL8g==",
"requires": {
"async-validator": "^1.8.2",
"xss": "^1.0.7"
}
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"abs-svg-path": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz",
@ -524,6 +541,12 @@
}
}
},
"assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
"astral-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
@ -586,6 +609,20 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"chai": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
"integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
"dev": true,
"requires": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
"deep-eql": "^3.0.1",
"get-func-name": "^2.0.0",
"pathval": "^1.1.0",
"type-detect": "^4.0.5"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@ -603,6 +640,12 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
"check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
"dev": true
},
"cheerio": {
"version": "1.0.0-rc.3",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
@ -658,6 +701,27 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"condense-newlines": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz",
"integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=",
"dev": true,
"requires": {
"extend-shallow": "^2.0.1",
"is-whitespace": "^0.3.0",
"kind-of": "^3.0.2"
}
},
"config-chain": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
"integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
"dev": true,
"requires": {
"ini": "^1.3.4",
"proto-list": "~1.2.1"
}
},
"confusing-browser-globals": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
@ -872,6 +936,15 @@
"ms": "^2.1.1"
}
},
"deep-eql": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"requires": {
"type-detect": "^4.0.0"
}
},
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@ -901,6 +974,12 @@
"esutils": "^2.0.2"
}
},
"dom-event-types": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz",
"integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==",
"dev": true
},
"dom-serializer": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
@ -936,6 +1015,18 @@
"domelementtype": "1"
}
},
"editorconfig": {
"version": "0.15.3",
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
"integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
"dev": true,
"requires": {
"commander": "^2.19.0",
"lru-cache": "^4.1.5",
"semver": "^5.6.0",
"sigmund": "^1.0.1"
}
},
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
@ -1284,6 +1375,15 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
},
"external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@ -1385,6 +1485,12 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true
},
"gl-matrix": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz",
@ -1516,6 +1622,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
"inquirer": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
@ -1577,6 +1689,12 @@
"integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
"dev": true
},
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
@ -1613,6 +1731,12 @@
"has-symbols": "^1.0.1"
}
},
"is-whitespace": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz",
"integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@ -1625,6 +1749,27 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
"js-beautify": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.0.tgz",
"integrity": "sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA==",
"dev": true,
"requires": {
"config-chain": "^1.1.12",
"editorconfig": "^0.15.3",
"glob": "^7.1.3",
"mkdirp": "^1.0.4",
"nopt": "^5.0.0"
},
"dependencies": {
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true
}
}
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -1668,6 +1813,15 @@
"minimist": "^1.2.0"
}
},
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
},
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@ -1705,6 +1859,16 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"memory-fs": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
@ -1801,6 +1965,15 @@
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
"dev": true,
"requires": {
"abbrev": "1"
}
},
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@ -2044,6 +2217,12 @@
"pify": "^2.0.0"
}
},
"pathval": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
"integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
"dev": true
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
@ -2082,6 +2261,17 @@
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"dev": true
},
"pretty": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz",
"integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=",
"dev": true,
"requires": {
"condense-newlines": "^0.2.1",
"extend-shallow": "^2.0.1",
"js-beautify": "^1.6.12"
}
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@ -2094,12 +2284,24 @@
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
"integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
"dev": true
},
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
"dev": true
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@ -2240,6 +2442,12 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
"sigmund": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
"integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
"dev": true
},
"signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
@ -2518,6 +2726,12 @@
"prelude-ls": "~1.1.2"
}
},
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
"uri-js": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
@ -2624,6 +2838,12 @@
"commander": "^2.20.3",
"cssfilter": "0.0.10"
}
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
}
}
}

View File

@ -5,7 +5,8 @@
"main": "index.js",
"scripts": {
"build": "fes build",
"dev": "fes dev"
"dev": "fes dev",
"test": "fes test:unit"
},
"keywords": [
"管理端",
@ -30,7 +31,9 @@
"license": "MIT",
"devDependencies": {
"@webank/eslint-config-webank": "^0.1.4",
"csp-html-webpack-plugin": "^4.0.0"
"csp-html-webpack-plugin": "^4.0.0",
"chai": "^4.2.0",
"@vue/test-utils": "^1.1.0"
},
"dependencies": {
"@antv/data-set": "^0.11.7",

View File

@ -0,0 +1,21 @@
<template>
<div>
{{count}}
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
};
},
methods: {
increment() {
this.count++;
}
}
};
</script>

View File

@ -0,0 +1,13 @@
import Vue from 'vue';
import { shallowMount } from '@vue/test-utils';
import { expect } from 'chai';
import Counter from '../src/components/Counter.vue';
describe('Counter.vue', () => {
it('increments count when button is clicked', async () => {
const wrapper = shallowMount(Counter);
wrapper.find('button').trigger('click');
await Vue.nextTick();
expect(wrapper.find('div').text()).contains('1');
});
});