Açısal klips ile yalnızca bir test özelliği nasıl çalıştırılır


143

Angular-CLI (beta 20) ile Angular2 proje derlemem var.

Seçilen tek bir spec dosyasına karşı test çalıştırmanın bir yolu var mı?

Angular2 hızlı başlatmaya dayalı bir projem vardı ve yasemin dosyasına manuel olarak özellikler ekleyebilirdim. Ancak bunu karma testinin dışında nasıl ayarlayacağımı veya karma testlerini Angular-CLI yapılarıyla belirli dosyalarla nasıl sınırlandıracağımı bilmiyorum.

Yanıtlar:


224

.spec.tsDosyanızın her biri tüm testlerini describeşu şekilde blok halinde gruplandırır :

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

describeİşlev adının önüne aşağıdakileri ekleyerek yalnızca bu tek bloğu kolayca çalıştırabilirsiniz f:

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

Böyle bir işleve sahipseniz, başka hiçbir describeblok çalışmaz. Btw. it=> ile benzer bir şey yapabilirsiniz fitve ayrıca bir "kara liste" sürümü de vardır x. Yani:

  • fdescribeve yalnızca bu şekilde işaretlenen işlevlerin çalışmasına fitneden olur
  • xdescribeve bu şekilde işaretlenen işlevler dışındaki tüm işlevlerin çalışmasına xitneden olur

1
Helloworld.component.spec.ts dosyamda fdescribe kullandım ancak app.component.spec.ts dosyasının hataları da gösterilir.
Usta Yoda

1
Bunun nedeni, tüm kodun değerlendirilmesidir (aksi takdirde testlerinizde fdescribes olduğunu bilmez) - fdescribe sadece test sonuçlarının yürütülmesini sınırlar. Diğer dosyalardaki sözdizimi / typescript hatalarını düzeltmeniz gerekir.
Tomek Sułkowski

3
Bence OP bu yanıtı kabul etmesine rağmen, soru acutally nasıl sadece bir spec dosyasını değerlendirmek için olduğunu: P
roberto tomás

4
Cevap bu değil. @iislucas aşağıdaki cevabı veriyor.
Ben Racicot

Can Ben karşılaşmak üzerinde başarısız olacağını benim CI ortamında bazı bayrağı set fdescribeveya xdescribe? Tüm testleri atlayan bir PR birleştirmek için özensiz bir gözden geçiren (ben) istemiyorum.
ILikeFood

81

Klasörün test.tsiçindeki dosyayı yapılandır src:

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

/\.spec\.ts$/Test etmek istediğiniz dosya adıyla değiştirin . Örneğin:/app.component\.spec\.ts$/

Bu sadece test için çalışacaktır app.component.spec.ts.


8
cevap kabul edilmelidir, bu yaklaşım günlük olan gumpfy çıktı bir yük kaldırır - ayrıntılı olan fdescribe aksine
danday74

3
kolay çözüm :) çok zaman kazandırdı.
Detoxic-Soul

Bu, bileşenleri 'app' yani 'product-app.component.spec.ts' veya 'order-app.component.spec.ts' öncesi bir şeyle eşleştirecektir. Regx ile en büyük değilim. "App.component.spec.ts" i özellikle hedeflemenin bir yolu var mı?
hanesjw

/^app.component\.spec\.ts$/ denedim ama şans yok. Normal ifade test cihazında çalışıyor gibi görünüyor, ancak test bazı nedenlerden hoşlanmıyor; hata veriyor.
hanesjw

önerilen cevap olmalı
Anil Vangari

55

Açısal CLI ( ngkomut) ile yalnızca belirli bir dosyayı şu şekilde test edebilirsiniz :

ng test --main ./path/to/test.ts

Diğer dokümanlar https://angular.io/cli/test adresindedir

Bu, bağımsız kütüphane dosyaları için çalışırken açısal bileşenler / hizmetler / vb. İçin çalışmayacağını unutmayın. Bunun nedeni, açısal dosyaların diğer dosyalara (yani src/test.tsAçısal 7'de) bağımlılıkları olmasıdır . Ne yazık ki --mainbayrak birden fazla argüman almıyor.


2
Bu harika bir öneri ve işe yarıyor. Teşekkür ederim! Buna ek olarak, otomatik olarak oluşturulan bir component.spec.tsdosyaya yönlendirirsek, testlerin hiçbir zaman başlamayacağını göreceğiz: 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... Eminim daha fazla geçici çözüm birlikte saldırıya uğrayabilir, ancak farkında olunması gereken bir şeydir içinde yapılan kurulum src/main.tsve ithalatı bu durumda kullanılamıyor.
pulkitsinghal

Komut kullanarak tüm testleri çalıştırdığımda ng tyazdığım test geçer ancak belirli bir dosyayı çalıştırdığımda hata verir. TypeError: TestBedViewEngine._initIfNeeded'de (node_modules/@angular/core/fesm2015/testing.js: 3112: 1) null 'getComponentFromError' özelliği okunamıyor (node_modules/@angular/core/fesm2015/testing.js: 3112: 1) 3230: 1) UserContext'de Function.get (node_modules/@angular/core/fesm2015/testing.js: 2960: 1) 'de. <anonymous> (src / app / timebar.service.spec.ts: 14: 45) "
canbax

1
Bu cevap Açısal 8 için de geçerlidir. Tam olarak bir test spec dosyası çalıştıracağından, bu kabul edilen cevap olmalıdır.

2
Açısal 9 için bilinmeyen seçenek "--main" olsun :(
rmcsharry

6

Komut satırından hangi dosyaların seçildiğini kontrol edebilmek istiyorsanız, bunu Açısal 7 için yapmayı başardım.

Özetle, @angular-devkit/build-angular:browsertest dosyasını normalden geçirmek için özel bir webpack eklentisi kurmanız ve ardından oluşturmanız gerekir . Örneğin:

angular.json - test oluşturucuyu değiştirin @angular-devkit/build-angular:browserve özel bir yapılandırma dosyası ayarlayın:

...

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

extra-webpack.config.js - komut satırından normal ifadeyi okuyan bir web paketi yapılandırması oluşturun:

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 - teknik özellikleri düzenleyin

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

Ardından, varsayılanı geçersiz kılmak için aşağıdaki şekilde kullanın:

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

Ben belgelenmiş burada backstory türleri ve yanlış bağlantılar için şimdiden, özürlerini. Beni doğru yöne yönlendirdiği için @ Aish-Anu'nun yukarıdaki cevabına teşekkür ederiz.


4

Bu, Açısal 7'de benim için çalışıyor. Ng komutunun --main seçeneğine dayanmaktadır. Bu seçeneğin belgelenmemiş ve muhtemelen değişime tabi olup olmadığından emin değilim, ama benim için çalışıyor. Komut dosyaları bölümünde package.json dosyama bir satır koydum. Orada ng test komutuyla --main seçeneğini kullanarak, yürütmek istediğim .spec.ts dosyasının yolunu belirtirim. Örneğin

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

Böyle bir komut dosyasını çalıştırırken komut dosyasını çalıştırabilirsiniz. Ben npm bölümünde "test 1" üzerine tıklayarak Webstorm çalıştırın.


3

Bu sorunu grunt kullanarak kendim için çözdüm. Aşağıda homurdanan senaryo var. Komut dosyası, çalıştırılacak belirli testin komut satırı parametresini alır ve test.ts'in bir kopyasını oluşturur ve bu özel test adını oraya koyar.

Bunu çalıştırmak için, önce grunt-cli'yi aşağıdakileri kullanarak yükleyin:

npm install -g grunt-cli

Aşağıdaki homurdanma bağımlılıklarını paketinize koyun. 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"

Çalıştırmak için aşağıdaki grunt dosyasını kök klasörünüze Gruntfile.js olarak kaydedin. Sonra komut satırından çalıştırın:

grunt --target=app.component

Bu işlem app.component.spec.ts dosyasını çalıştırır.

Grunt dosyası aşağıdaki gibidir:

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

};

Kabul edilen çözüme baktığımda, bu şekilde tavsiye edilmediğini düşünmüyorum
Drenai

2
@Brian - benim çözüm kaynak kodunu değiştirmek zorunda kalmaz ve böylece dosya kontrol potansiyel hataları önler. Çözümüm, manuel adımları otomatikleştirerek komut satırında test adının belirlenmesini sağlar.
vanval

Evet, bu aslında iyi bir nokta. Xdescribe veya fdescribe'i kaldırmayı unutabilirsiniz - ve testiniz kalıcı olarak kaldırılacaktır!
Drenai

3
@Ryan, fdescribe / fit / xdescribe / xit çağrılarını kontrol etmek için tslint-jasmine-kurallarını kurabilir / yapılandırabilir ve tslint çalışmanızda başarısız olabilirsiniz; bu bir ön taahhüt adımının bir parçasıysa, yanlışlıkla odaklanmış veya devre dışı bırakılmış testlerinizi kontrol etmenizi engeller.
Neil Menzies

1

Bunu benim gibi Angular'da tek bir spec çalıştırmanın bir yolunu arayan ve bu SO'yu bulan insanlar için ekleyerek.

En son Açısal belgelere göre (yazma sırasında v9.0.6), ng testkomutun bir dosya --includedizini *.spec.(ts|tsx)veya yalnızca tek bir .spec.(ts|tsx)dosyanın kendisini belirtebileceğiniz bir seçeneği vardır .

https://angular.io/cli/test


0

test.tsSrc klasörü içindeki dosyada sadece küçük değişiklik ihtiyacı :

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

İşte, test-exampleçalıştırmamız gereken tam dosya adı

Aynı şekilde, yalnızca hizmet dosyasını test etmeniz gerekirse "/test-example.service" gibi dosya adını değiştirebilirsiniz.


0

Bu her durumda benim için çalıştı:

ng test --include='**/dealer.service.spec.ts'

Ancak, genellikle bunun için "TypeError: 'ngModule' özelliği okunamıyor" var:

ng test --main src/app/services/dealer.service.spec.ts

@ Angular / cli 10.0.4 sürümü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.