Answers:
每个.spec.ts
文件都将其所有测试分组在describe
块中,如下所示:
describe('SomeComponent', () => {...}
您可以通过在describe
函数名称前添加前缀来轻松运行此单个块f
:
fdescribe('SomeComponent', () => {...}
如果具有此功能,则不会describe
运行其他任何块。顺便说一句。您可以使用it
=> 做类似的事情,fit
并且还有一个“黑名单”版本- x
。所以:
fdescribe
并仅fit
导致以这种方式标记的功能运行xdescribe
并xit
导致所有以这种方式标记的功能运行fdescribe
或xdescribe
?我不希望草率的审阅者(me)合并跳过所有测试的PR。
配置test.ts
文件src
夹中的文件:
const context = require.context('./', true, /\.spec\.ts$/);
用/\.spec\.ts$/
您要测试的文件名替换。例如:/app.component\.spec\.ts$/
这只会针对进行测试app.component.spec.ts
。
您可以使用Angular CLI(ng
命令)仅测试特定文件,如下所示:
ng test --main ./path/to/test.ts
更多文档位于https://angular.io/cli/test
请注意,虽然这适用于独立库文件,但不适用于有角度的组件/服务/等。这是因为有角度的文件依赖于其他文件(即src/test.ts
在Angular 7中)。遗憾的是,该--main
标志没有多个参数。
component.spec.ts
文件,我们将看到测试永远不会启动:Error: AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/dist/async-test.js
...我敢肯定,可以将其他解决方法结合在一起,但这是需要注意的这是因为src/main.ts
在这种情况下无法进行内部设置及其导入。
ng t
,我正在编写的测试通过了,但是当我运行特定文件时,它给出了错误。TypeError:在TestBedViewEngine.get(node_modules/@angular/core/fesm2015/testing.js: 3230:1)在UserContext上的Function.get(node_modules/@angular/core/fesm2015/testing.js:2960:1)。<匿名>(src / app / timebar.service.spec.ts:14:45)”
如果您希望能够控制从命令行中选择了哪些文件,我设法对Angular 7进行了此操作。
总之,您需要安装 @angular-devkit/build-angular:browser
然后创建自定义Webpack插件以通过测试文件regex。例如:
angular.json-从更改测试生成器@angular-devkit/build-angular:browser
并设置自定义配置文件:
...
"test": {
"builder": "@angular-builders/custom-webpack:browser",
"options": {
"customWebpackConfig": {
"path": "./extra-webpack.config.js"
},
...
extra-webpack.config.js-创建一个从命令行读取正则表达式的webpack配置:
const webpack = require('webpack');
const FILTER = process.env.KARMA_FILTER;
let KARMA_SPEC_FILTER = '/.spec.ts$/';
if (FILTER) {
KARMA_SPEC_FILTER = `/${FILTER}.spec.ts$/`;
}
module.exports = {
plugins: [new webpack.DefinePlugin({KARMA_SPEC_FILTER})]
}
test.ts-编辑规格
...
// Then we find all the tests.
declare const KARMA_CONTEXT_SPEC: any;
const context = require.context('./', true, KARMA_CONTEXT_SPEC);
然后使用以下命令覆盖默认值:
KARMA_FILTER='somefile-.*\.spec\.ts$' npm run test
我自己用咕solved声解决了这个问题。我有下面的咕unt声脚本。该脚本的作用是运行特定测试的命令行参数,并创建一个test.ts副本,并将该特定测试名称放入其中。
要运行此程序,请首先使用以下命令安装grunt-cli:
npm install -g grunt-cli
将以下grunt依赖项放入package.json中:
"grunt": "^1.0.1",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-exec": "^2.0.0",
"grunt-string-replace": "^1.3.1"
要运行它,请将以下grunt文件另存为root文件夹中的Gruntfile.js。然后从命令行运行它为:
grunt --target=app.component
这将运行app.component.spec.ts。
Grunt文件如下:
/*
This gruntfile is used to run a specific test in watch mode. Example: To run app.component.spec.ts , the Command is:
grunt --target=app.component
Do not specific .spec.ts. If no target is specified it will run all tests.
*/
module.exports = function(grunt) {
var target = grunt.option('target') || '';
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
clean: ['temp.conf.js','src/temp-test.ts'],
copy: {
main: {
files: [
{expand: false, cwd: '.', src: ['karma.conf.js'], dest: 'temp.conf.js'},
{expand: false, cwd: '.', src: ['src/test.ts'], dest: 'src/temp-test.ts'}
],
}
},
'string-replace': {
dist: {
files: {
'temp.conf.js': 'temp.conf.js',
'src/temp-test.ts': 'src/temp-test.ts'
},
options: {
replacements: [{
pattern: /test.ts/ig,
replacement: 'temp-test.ts'
},
{
pattern: /const context =.*/ig,
replacement: 'const context = require.context(\'./\', true, /'+target+'\\\.spec\\\.ts$/);'
}]
}
}
},
'exec': {
sleep: {
//The sleep command is needed here, else webpack compile fails since it seems like the files in the previous step were touched too recently
command: 'ping 127.0.0.1 -n 4 > nul',
stdout: true,
stderr: true
},
ng_test: {
command: 'ng test --config=temp.conf.js',
stdout: true,
stderr: true
}
}
});
// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-string-replace');
grunt.loadNpmTasks('grunt-exec');
// Default task(s).
grunt.registerTask('default', ['clean','copy','string-replace','exec']);
};
对于像我这样的人,他们正在寻找一种方法来在Angular中运行单个规范并找到了这种SO,这也增加了这一点。
根据最新的Angular文档(撰写本文时为v9.0.6),该ng test
命令具有一个--include
选项,您可以在其中指定*.spec.(ts|tsx)
文件目录或仅指定一个.spec.(ts|tsx)
文件本身。