Angular-cli 没有运行 spec.ts 文件

Posted

技术标签:

【中文标题】Angular-cli 没有运行 spec.ts 文件【英文标题】:Angular-cli not running spec.ts files 【发布时间】:2017-04-06 12:53:57 【问题描述】:

我在 Webstorm 中创建了一个 Angular-CLI 项目,并试图确保所有测试都在运行。它启动 chrome 浏览器,但不报告任何内容。所以我在第一个 it 块中修改了 app.component.spec.ts,只添加了一个 console.log 语句,它不会记录到控制台。

在我手动关闭 Chrome 之前,它不会报告任何内容或给出任何错误(出于某种原因,即使我将其设置为仅在它不自行关闭时才运行)。它也没有显示 console.log 语句。

Karma.config

// Karma 配置文件,更多信息见链接 // https://karma-runner.github.io/0.13/config/configuration-file.html module.exports = 功能(配置) 配置.set( 基本路径:'', 框架:['jasmine','angular-cli'], 插件:[ 要求('业力茉莉'), 需要('业力铬启动器'), 要求('业力重新映射-伊斯坦布尔'), 需要('angular-cli/plugins/karma') ], 文件:[ 模式:'./src/*/*.spec.ts',观看:假 ], 预处理器: './src/test.ts': ['angular-cli'] , 哑剧: '文本/x-typescript':['ts','tsx'] , 重映射伊斯坦布尔记者: 报告: html: '覆盖率', lcovonly: './coverage/coverage.lcov' , 角Cli: 配置:'./angular-cli.json', 环境:'开发' , 记者:config.angularCli && config.angularCli.codeCoverage ? ['进步','业力重新映射-伊斯坦布尔'] : ['进步'], 端口:9876, 颜色:真实, 日志级别:config.LOG_INFO, 自动监视:假, 浏览器:['Chrome'], 单跑:真 ); ;

关闭 Chrome 时出错:

22 11 2016 10:01:27.657:ERROR [karma]: TypeError: Cannot read property 'map' of undefined 在 ProgressReporter._render (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\reporters\progress.js:53:26) 在 ProgressReporter.writeCommonMsg (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\reporters\progress.js:9: 44) 在 ProgressReporter.BaseReporter.onBrowserError (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\reporters\b ase.js:63:10) 在服务器。 (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\events.js:13:22) 在 emitTwo (events.js:111:20) 在 Server.emit (events.js:191:7) 断开连接时(C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\browser.js:40:13) 在 Browser.onDisconnect (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\browser.js:157:7) 在套接字。 (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\karma\lib\events.js:13:22) 在 emitOne (events.js:96:13) 在 Socket.emit (events.js:188:7) 在 Socket.emit (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\socket.io\lib\socket.js:128:10) 在 Socket.onclose (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\socket.io\lib\socket.js:425:8) 在 Client.onclose (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\socket.io\lib\client.js:232:24) 在 emitTwo (events.js:111:20) 在 Socket.emit (events.js:191:7) 在 Socket.onClose (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\engine.io\lib\socket.js:304:10) 在 WebSocket.g (events.js:291:16) 在 emitNone (events.js:86:13) 在 WebSocket.emit (events.js:185:7) 在 WebSocket.Transport.onClose (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\engine.io\lib\transport.js:126:8) 在 WebSocket.g (events.js:291:16) 在 emitTwo (events.js:106:13) 在 WebSocket.emit (events.js:191:7) 在 WebSocket.cleanupWebsocketResources (C:\Users\Amy\WebstormProjects\SportsTactician\node_modules\engine.io\node_modules\ws\lib\ WebSocket.js:927:10) 在 emitOne (events.js:101:20) 在 Socket.emit (events.js:188:7) 在 emitErrorNT (net.js:1276:8) 在 _combinedTickCallback (内部/进程/next_tick.js:74:11) 在 process._tickCallback (internal/process/next_tick.js:98:9)

【问题讨论】:

【参考方案1】:

所以似乎关闭自动监视是造成这种情况的原因。如果我重新打开它,它可以工作。当您通过 ng test 运行时,似乎将 singleRun 设置为 true 的效果为零。

如果你想在 autoWatch 为 false 和 singleRun 为 true 的情况下运行它,你需要使用 karma start。老派FTW!

更新:

根据Angular-CLI usage docs,要使用singleRun并且没有autoWatch:

运行单元测试

ng test

测试将在通过 Karma 执行构建后执行,它会自动监视文件的更改。您可以通过--watch=false--single-run 运行一次测试。

【讨论】:

【参考方案2】:

听起来您想打开 autoWatch 并打开 singleRun。使用 --config 传递一个单独的配置文件进行测试。如果您只关心结果,这也允许您不显示 chrome 窗口,同时在您想要调试测试时仍保留原始配置。

进行以下配置文件更改并运行npm run test:headlessng test --config karma.conf.headless.js。您还可以在 ci 环境中使用它在 vm 中运行测试并记录测试结果。

添加新节点脚本以无头运行您的测试。

package.json:


...
  "scripts": 
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "test:headless": "ng test --config karma.conf.headless.js",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "e2e:headless": "ng e2e --config protractor.conf.headless.js"
  ,
...

karma.conf.headless.js

module.exports = function(config) 
  config.set(
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular/cli/plugins/karma')
    ],
    client:
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    ,
    coverageIstanbulReporter: 
      reports: [ 'html', 'lcovonly' ],
      fixWebpackSourcePaths: true
    ,
    angularCli: 
      environment: 'dev'
    ,
    reporters: config.angularCli && config.angularCli.codeCoverage
        ? ['progress', 'coverage-istanbul']
        : ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['ChromeHeadless'],
    singleRun: true,
    customLaunchers: 
        ChromeHeadless: 
            base: 'Chrome',
            flags: [
                // See https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
                '--headless',
                '--disable-gpu',
                // Without a remote debugging port, Google Chrome exits immediately.
                '--remote-debugging-port=9222',
            ]
        
    
  );
;

为了完整起见,这里也是量角器 conf protractor.conf.headless.js

const  SpecReporter  = require('jasmine-spec-reporter');

exports.config = 
  allScriptsTimeout: 11000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: 
    'browserName': 'chrome',
    chromeOptions: 
        args: [ "--headless", "--disable-gpu", "--window-size=1280x720" ]
    
  ,
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: 
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() 
  ,
  onPrepare() 
    require('ts-node').register(
      project: 'e2e/tsconfig.e2e.json'
    );
    jasmine.getEnv().addReporter(new SpecReporter( spec:  displayStacktrace: true  ));
  
;

【讨论】:

不,我不关心自动手表的任何一种方式。但似乎 ng test 做到了!我讨厌无头奔跑,因为你不能那样设置断点。 我不确定我是否理解这个问题。当我运行 npm run test 时,我有 2 个默认配置,它在自动监视开启的情况下启动 chrome 中的测试。我大部分时间都使用它,所以我可以设置断点和调试。另一个是当我运行在 CI 构建中使用的 npm run test:headless 以及我只想在控制台中查看测试结果时。您是否正在寻找类似在 chrome 中运行但不关注变化的东西? 我认为这可能只是特定版本的 Angular-CLI 的问题。您目前使用的是我在 11 月使用的同一个吗?根据下面的文档,该版本关闭了命令行开关,而不是 karma 配置文件。

以上是关于Angular-cli 没有运行 spec.ts 文件的主要内容,如果未能解决你的问题,请参考以下文章

*.directive.spec.ts 中的错误 TS2554

使用 mocha 和 ts-node 运行位于单独目录中的测试?

仅将 TypeScript 环境声明添加到特定文件(如 *.spec.ts)

Angular CLI 生成的“spec.ts”文件有啥用?

转译时排除 *.spec.ts 文件,但仍能正确 lint

typescript users.spec.ts