【问题标题】:How can I debug a JS Unit Test with Karma & Jasmine in Intellij or Webstorm如何在 Intellij 或 Webstorm 中使用 Karma 和 Jasmine 调试 JS 单元测试
【发布时间】:2016-09-07 18:43:47
【问题描述】:

我正在尝试调试用 Jasmine 编写并由 Karma 运行的 JS 单元测试。运行测试时,如何在 Intellij 的测试中设置断点?以及如何执行单个测试?

这是我用于执行 Karma 测试的 Intellij 运行配置

这是我的示例单元测试

import {
    RouterTestingModule
} from '@angular/router/testing';
import {
    async,
    TestBed,
    ComponentFixture
} from '@angular/core/testing';
import { provideRoutes, Routes, RouterModule } from '@angular/router';
import { Component } from '@angular/core';

import { AppComponent } from './app.component';
import { NavbarComponent } from './shared/navbar/navbar.component';

@Component({
    selector: 'as-test-cmp',
    template: '<div class="title">Hello test</div>'
})
class TestRouterComponent {
}

let config: Routes = [
    {
        path: '', component: TestRouterComponent
    }
];

describe('AppComponent', () => {
    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [
                TestRouterComponent,
                AppComponent,
                NavbarComponent
            ],
            imports: [ RouterTestingModule, RouterModule ],
            providers: [ provideRoutes(config) ]
        });
    });

    it('should have title Hello world', async(() => {
        TestBed.compileComponents().then(() => {
            let fixture: ComponentFixture<AppComponent>;
            fixture = TestBed.createComponent(AppComponent);
            fixture.detectChanges();

            let compiled = fixture.debugElement.nativeElement;
            expect(compiled).toBeDefined();
            // TODO: find a way to compile the routed component
            // expect(compiled.querySelector('div.title')).toMatch('Hello world');
        });
    }));
});

这是我的 karma.conf.js

module.exports = function (config) {
    var gulpConfig = require('../gulp/config')();

    /**
     * List of npm packages that imported via `import` syntax
     */
    var dependencies = [
        '@angular',
        'lodash',
        'rxjs',
        'moment'
    ];

    var configuration = {
        basePath: '../../',

        frameworks: ['jasmine'],
        browsers: ['PhantomJS'],
        reporters: ['progress', 'coverage'],

        preprocessors: {},

        // Generate json used for remap-istanbul
        coverageReporter: {
            dir: 'report/',
            reporters: [
                {type: 'json', subdir: 'report-json'}
            ]
        },

        files: [
            'node_modules/core-js/client/shim.min.js',
            'node_modules/zone.js/dist/zone.js',
            'node_modules/zone.js/dist/long-stack-trace-zone.js',
            'node_modules/zone.js/dist/proxy.js',
            'node_modules/zone.js/dist/sync-test.js',
            'node_modules/zone.js/dist/jasmine-patch.js',
            'node_modules/zone.js/dist/async-test.js',
            'node_modules/zone.js/dist/fake-async-test.js',
            'node_modules/systemjs/dist/system.src.js',
            'node_modules/moment/moment.js'
        ],

        // proxied base paths
        proxies: {
            // required for component assests fetched by Angular's compiler
            "/src/": "/base/src/",
            "/app/": "/base/src/app/",
            "/node_modules/": "/base/node_modules/"
        },

        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true
    };

    configuration.preprocessors[gulpConfig.tmpApp + '**/!(*.spec)+(.js)'] = ['coverage'];
    configuration.preprocessors[gulpConfig.tmpApp + '**/*.js'] = ['sourcemap'];
    configuration.preprocessors[gulpConfig.tmpTest + '**/*.js'] = ['sourcemap'];

    var files = [
        gulpConfig.tmpTest + 'test-helpers/global/**/*.js',
        gulpConfig.src + 'systemjs.conf.js',
        'config/test/karma-test-shim.js',
        createFilePattern(gulpConfig.tmpApp + '**/*.js', {included: false}),
        createFilePattern(gulpConfig.tmpTest + 'test-helpers/*.js', {included: false}),
        createFilePattern(gulpConfig.app + '**/*.html', {included: false}),
        createFilePattern(gulpConfig.app + '**/*.css', {included: false}),
        createFilePattern(gulpConfig.app + '**/*.ts', {included: false, watched: false}),
        createFilePattern(gulpConfig.tmpApp + '**/*.js.map', {included: false, watched: false})
    ];

    configuration.files = configuration.files.concat(files);

    dependencies.forEach(function (key) {
        configuration.files.push({
            pattern: 'node_modules/' + key + '/**/*.js',
            included: false,
            watched: false
        });
    });

    if (process.env.APPVEYOR) {
        configuration.browsers = ['IE'];
        configuration.singleRun = true;
        configuration.browserNoActivityTimeout = 90000; // Note: default value (10000) is not enough
    }

    config.set(configuration);

    // Helpers
    function createFilePattern(path, config) {
        config.pattern = path;
        return config;
    }
}
module.exports = function (config) {
    var gulpConfig = require('../gulp/config')();

    /**
     * List of npm packages that imported via `import` syntax
     */
    var dependencies = [
        '@angular',
        'lodash',
        'rxjs',
        'moment'
    ];

    var configuration = {
        basePath: '../../',

        frameworks: ['jasmine'],
        browsers: ['PhantomJS'],
        reporters: ['progress', 'coverage'],

        preprocessors: {},

        // Generate json used for remap-istanbul
        coverageReporter: {
            dir: 'report/',
            reporters: [
                {type: 'json', subdir: 'report-json'}
            ]
        },

        files: [
            'node_modules/core-js/client/shim.min.js',
            'node_modules/zone.js/dist/zone.js',
            'node_modules/zone.js/dist/long-stack-trace-zone.js',
            'node_modules/zone.js/dist/proxy.js',
            'node_modules/zone.js/dist/sync-test.js',
            'node_modules/zone.js/dist/jasmine-patch.js',
            'node_modules/zone.js/dist/async-test.js',
            'node_modules/zone.js/dist/fake-async-test.js',
            'node_modules/systemjs/dist/system.src.js',
            'node_modules/moment/moment.js'
        ],

        // proxied base paths
        proxies: {
            // required for component assests fetched by Angular's compiler
            "/src/": "/base/src/",
            "/app/": "/base/src/app/",
            "/node_modules/": "/base/node_modules/"
        },

        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true
    };

    configuration.preprocessors[gulpConfig.tmpApp + '**/!(*.spec)+(.js)'] = ['coverage'];
    configuration.preprocessors[gulpConfig.tmpApp + '**/*.js'] = ['sourcemap'];
    configuration.preprocessors[gulpConfig.tmpTest + '**/*.js'] = ['sourcemap'];

    var files = [
        gulpConfig.tmpTest + 'test-helpers/global/**/*.js',
        gulpConfig.src + 'systemjs.conf.js',
        'config/test/karma-test-shim.js',
        createFilePattern(gulpConfig.tmpApp + '**/*.js', {included: false}),
        createFilePattern(gulpConfig.tmpTest + 'test-helpers/*.js', {included: false}),
        createFilePattern(gulpConfig.app + '**/*.html', {included: false}),
        createFilePattern(gulpConfig.app + '**/*.css', {included: false}),
        createFilePattern(gulpConfig.app + '**/*.ts', {included: false, watched: false}),
        createFilePattern(gulpConfig.tmpApp + '**/*.js.map', {included: false, watched: false})
    ];

    configuration.files = configuration.files.concat(files);

    dependencies.forEach(function (key) {
        configuration.files.push({
            pattern: 'node_modules/' + key + '/**/*.js',
            included: false,
            watched: false
        });
    });

    if (process.env.APPVEYOR) {
        configuration.browsers = ['IE'];
        configuration.singleRun = true;
        configuration.browserNoActivityTimeout = 90000; // Note: default value (10000) is not enough
    }

    config.set(configuration);

    // Helpers
    function createFilePattern(path, config) {
        config.pattern = path;
        return config;
    }
}

【问题讨论】:

  • 要执行单个测试,您应该使用“fit”而不是“it”。目前这是唯一的方法,因为 karma 会加载整个文件。如果您只想运行一个套件,则可以使用“fdescribe”。
  • 你知道怎么做吗?我面临着完全相同的问题,我尝试的一切都没有奏效。能够做到这一点似乎是一种正常的期望。

标签: javascript unit-testing intellij-idea jasmine karma-runner


【解决方案1】:

上面的答案是对的,但在此之前你必须安装chrome扩展Jetbrains IDE support plugin,然后你才能在你的WebStorm中调试。

【讨论】:

    【解决方案2】:

    您可以在浏览器上进行调试。只需单击 DEBUG 按钮,找到您的类并在您想要的任何位置添加断点。要再次运行它,只需刷新页面即可。

    【讨论】:

    • 我知道在 Karma 执行时该怎么做。我希望能够像使用其他语言一样在我的 IDE 中进行调试。
    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-05-29
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多