[angular] angular-cli를 사용하여 하나의 테스트 사양 만 실행하는 방법

Angular-CLI (베타 20)로 Angular2 프로젝트 빌드가 있습니다.

하나의 선택된 스펙 파일에 대해서만 테스트를 실행하는 방법이 있습니까?

나는 Angular2 빠른 시작을 기반으로 한 프로젝트를 가지고 있었고 Jasmine 파일에 사양을 수동으로 추가 할 수있었습니다. 그러나 Karma 테스트 외부에서 이것을 설정하는 방법이나 Angular-CLI 빌드를 사용하여 Karma 테스트를 특정 파일로 제한하는 방법을 모르겠습니다.



답변

.spec.ts파일에는 describe다음과 같이 모든 테스트가 블록 단위로 그룹화되어 있습니다 .

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

describe함수 이름 앞에 다음을 붙여이 단일 블록 만 쉽게 실행할 수 있습니다 f.

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

이러한 기능이 있으면 다른 describe블록이 실행 되지 않습니다 . Btw. it=> fit와 비슷한 작업을 수행 할 수 있으며 “블랙리스트”버전도 x있습니다. 그래서:

  • fdescribefit원인 에만 실행하려면이 방법을 표시 기능을
  • xdescribexit원인 을 모두하지만, 기능을 실행하려면이 방법을 표시

답변

폴더 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국기는 여러 가지 주장을 취하지 않습니다.


답변

명령 줄에서 선택한 파일을 제어하려면 Angular 7 에서이 작업을 수행했습니다.

요약 @angular-devkit/build-angular:browser하면 테스트 파일 정규식을 통과시키기 위해 사용자 정의 웹팩 플러그인을 설치 한 다음 작성 해야합니다 . 예를 들면 다음과 같습니다.

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- 명령 행에서 정규식을 읽는 웹팩 구성을 작성하십시오.

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의 올바른 답변을 알려 주신 위의 답변에 감사드립니다.


답변

이것은 Angular 7에서 저에게 효과적입니다. ng 명령의 –main 옵션을 기반으로합니다. 이 옵션이 문서화되어 있지 않고 변경 될 수 있는지 확실하지 않지만 나에게 적합합니다. 스크립트 섹션의 package.json 파일에 줄을 넣습니다. ng test 명령과 함께 –main 옵션을 사용하여 실행하려는 .spec.ts 파일의 경로를 지정합니다. 예를 들어

"test 1": "ng test --main E:/WebRxAngularClient/src/app/test/shared/my-date-utils.spec.ts",

그러한 스크립트를 실행할 때 스크립트를 실행할 수 있습니다. npm 섹션에서 “test 1″을 클릭하여 Webstorm에서 실행합니다.


답변

grunt를 사용 하여이 문제를 직접 해결했습니다. 아래에 그런 스크립트가 있습니다. 스크립트는 특정 테스트의 명령 행 매개 변수를 실행하여 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 파일을 루트 폴더에 Gruntfile.js로 저장하십시오. 그런 다음 명령 행에서 다음을 실행하십시오.

grunt --target=app.component

app.component.spec.ts가 실행됩니다.

그런트 파일은 다음과 같습니다.

/*
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)파일 자체를 지정할 수 있는 옵션이 있습니다 .

https://angular.io/cli/test