Подтвердить что ты не робот

Как выполнить только одну тестовую спецификацию с помощью angular -cli

У меня есть проект Angular2 с Angular-CLI (бета 20).

Есть ли способ запустить тесты только с одним выбранным файлом спецификации?

Раньше у меня был проект, основанный на быстром запуске Angular2, и я мог вручную добавить спецификации в файл жасмина. Но я не знаю, как настроить это вне тестирования кармы или как ограничить тесты кармы конкретными файлами в сборках Angular-CLI.

4b9b3361

Ответ 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, они будут выполнены, а сброс игнорируется