247 votes

Comment faire pour exécuter un seul test spec avec angulaires-cli

J'ai Angular2 projet de construction avec Angulaires-CLI (bêta 20).

Est-il possible d'exécuter des tests, contre une seule dans le fichier de spécification?

J'ai l'habitude d'avoir un projet basé sur Angular2 de démarrage rapide, et je pourrais ajouter manuellement des spécifications de jasmin fichier. Mais je ne sais pas comment mettre cela en place à l'extérieur du karma tests ou comment limiter le karma des tests à des fichiers spécifiques avec Angulaires-CLI construit.

334voto

Tomek Sułkowski Points 4513

Chacun de vos .spec.ts le fichier de tous ses tests regroupés en describe bloc comme ceci:

describe('SomeComponent', () => {...}

Vous pouvez facilement exécuter juste ce seul bloc, par la préfixation de l' describe nom de la fonction avec f:

fdescribe('SomeComponent', () => {...}

Si vous avez une telle fonction, aucune autre describe blocs sera exécuté. Btw. vous pouvez faire la même chose avec it => fit et il y a aussi une "liste noire" version - x. Donc:

  • fdescribe et fit des causes uniquement les fonctions marquées de cette façon à exécuter
  • xdescribe et xit des causes de tous, mais les fonctions marquées de cette façon à exécuter

128voto

Aish Anu Points 271

Configurer test.ts le fichier à l'intérieur d' src le dossier:

const context = require.context('./', true, /\.spec\.ts$/);

Remplacer /\.spec\.ts$/ avec le nom de fichier que vous souhaitez tester. Par exemple: /app.component\.spec\.ts$/

Cela va lancer le test uniquement pour app.component.spec.ts.

8voto

6EQUJ5 Points 2541

Si vous voulez être en mesure de contrôler les fichiers sont sélectionnés à partir de la ligne de commande, j'ai réussi à faire ce Angulaire 7.

En résumé, vous devez installer @angular-devkit/build-angular:browser , puis de créer un personnalisé webpack plugin pour passer le test de fichier regex par. Par exemple:

angulaire.json - changer le générateur de test à partir d' @angular-devkit/build-angular:browser et personnaliser le fichier de config:

...

        "test": {
          "builder": "@angular-builders/custom-webpack:browser",
          "options": {
            "customWebpackConfig": {
              "path": "./extra-webpack.config.js"
            },
...

extra-webpack.config.js - créer un webpack de configuration qui lit l'expression régulière à partir de la ligne de commande:

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 - modifier le spec

...
// Then we find all the tests.
declare const KARMA_CONTEXT_SPEC: any;
const context = require.context('./', true, KARMA_CONTEXT_SPEC);

Ensuite les utiliser comme suit pour remplacer la valeur par défaut:

KARMA_FILTER='somefile-.*\.spec\.ts$' npm run test

J'ai documenté de l' histoire, ici, toutes mes excuses à l'avance pour les types et les mis-liens. Crédit à la réponse ci-dessus par @Aish-Anu pour me pointer dans la bonne direction.

3voto

vanval Points 74

J'ai résolu ce problème par moi-même à l'aide de grunt. J'ai le grognement script ci-dessous. Ce que fait le script est prend le paramètre de ligne de commande de l'épreuve spécifique à exécuter et crée une copie de test.ts et met ce nom de test.

Pour exécuter cette, première installer grunt-cli à l'aide de:

npm install -g grunt-cli

Mettez le en dessous de grunt dépendances dans votre forfait.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"

Pour l'exécuter ci-dessous enregistrez le fichier en tant que grunt Gruntfile.js dans votre dossier racine. Puis, à partir de la ligne de commande exécuter en tant que:

grunt --target=app.component

Cela va lancer l'application.composante.spec.ts.

Grunt fichier est comme ci-dessous:

/*
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']);

};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X