Как выполнить только одну тестовую спецификацию с помощью angular -cli
У меня есть проект Angular2 с Angular-CLI (бета 20).
Есть ли способ запустить тесты только с одним выбранным файлом спецификации?
Раньше у меня был проект, основанный на быстром запуске Angular2, и я мог вручную добавить спецификации в файл жасмина. Но я не знаю, как настроить это вне тестирования кармы или как ограничить тесты кармы конкретными файлами в сборках Angular-CLI.
Ответы
Ответ 1
Каждый из ваших файлов .spec.ts
имеет все свои тесты, сгруппированные в блок describe
следующим образом:
describe('SomeComponent', () => {...}
Вы можете легко запустить только этот один блок, префикс имени функции describe
с помощью f
:
fdescribe('SomeComponent', () => {...}
Если у вас есть такая функция, никакие другие блоки describe
не будут выполняться.
Btw. вы можете сделать аналогичную вещь с it
= > fit
, а также есть версия "черного списка" - x
. Итак:
-
fdescribe
и fit
вызывает только функции, помеченные таким образом, чтобы запускать
-
xdescribe
и xit
вызывает все функции , отмеченные таким образом, чтобы запускать
Ответ 2
Сконфигурируйте файл test.ts
внутри папки src
:
const context = require.context('./', true, /\.spec\.ts$/);
Замените /\.spec\.ts$/
именем файла, который вы хотите проверить. Например: /app.component\.spec\.ts$/
Это запустит тест только для app.component.spec.ts
.
Ответ 3
You can test only specific file with the Angular CLI (команда ng
) можно протестировать только таким файлом:
ng test --main ./path/to/test.ts
Другие документы на https://angular.io/cli/test
Обратите внимание, что хотя это работает для автономных файлов библиотеки, оно не будет работать для angular компонентов/служб/и т.д. Это связано с тем, что angular файлы имеют зависимости от других файлов (а именно src/test.ts
в Angular 7). К сожалению, флаг --main
не принимает несколько аргументов.
Ответ 4
Если вы хотите иметь возможность контролировать, какие файлы выбираются из командной строки, мне удалось сделать это для Angular 7.
Таким образом, вам нужно установить @angular-devkit/build-angular:browser
и затем создать собственный плагин webpack для прохождения регулярного выражения тестового файла. Например:
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
Я задокументировал предысторию здесь, заранее извиняюсь за типы и ошибочные ссылки. Отдайте должное ответу @Aish-Anu, приведенному выше, за указание в правильном направлении.
Ответ 5
Это работает для меня в Angular 7. Он основан на опции --main команды ng. Я не уверен, если эта опция недокументирована и может быть изменена, но она работает для меня. Я поместил строку в мой файл package.json в разделе скриптов. Там, используя опцию --main с командой ng test, я указываю путь к файлу .spec.ts, который я хочу выполнить. Например
"test 1": "ng test --main E:/WebRxAngularClient/src/app/test/shared/my-date-utils.spec.ts",
Вы можете запустить скрипт так же, как и любой другой скрипт. Я запускаю его в Webstorm, нажимая "test 1" в разделе npm.
Ответ 6
Я решил эту проблему для себя, используя хрюканье. У меня есть хрюканье script ниже. То, что делает script, принимает параметр командной строки для конкретного теста для запуска и создает копию test.ts и помещает здесь это конкретное тестовое имя.
Чтобы запустить это, сначала установите grunt-cli, используя:
npm install -g grunt-cli
Поместите нижеприведенные зависимости в вашем пакете .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 в формате 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']);
};
Ответ 7
В каждом файле spec.ts
все тесты сгруппированы в блоке описания:
По умолчанию это выглядит так:
describe('Component', () => { }
Если вы хотите выполнить определенные тестовые случаи:
fdescribe('Component', () => { }
Чтобы игнорировать файл, вы можете использовать 'x':
xdescribe('Component', () => { }
Подробнее:
xdescribe
исключит эти спецификации из исполнения.
fdescribe
сначала выполнит эти спецификации. если у вас есть обе спецификации fdescribe, они будут выполнены, а сброс игнорируется