Как заставить тесты мокко читать и использовать инструментированный код из Стамбула?

Я хочу иметь возможность использовать репортер html-cov, хотя тесты проходят, все значения покрытия равны 0.

Я использую Grunt, Istanbul для создания инструментированного кода и mocha для тестов, это мой файл grunt.

module.exports = (grunt) ->

  release = (type = 'develop') ->
    switch type
      when 'master'
        grunt.task.run('release')
      else
        grunt.config.set('release',
          options:
            tag     : false
            pushTags: false
            npm     : false
        )

        grunt.task.run('release')

    return

  grunt.initConfig

    pkg: grunt.file.readJSON 'package.json'

    covervars:
      base   : 'tests/lib-cov'
      build  : '<%=covervars.base %>/build'
      reports: '<%=covervars.base %>/reports'

    watch:
      coffee:
        files: ['./src/**/*.coffee', './tests/**/*.spec.coffee']
        tasks: ['build']

    coffee:
      compile:
        options:
          bare: true
        expand : true
        cwd    : 'src'
        src    : '**/*.coffee'
        dest   : 'lib'
        ext    : '.js'

    clean:
      coverage: [
        '<%=covervars.base %>/*'
      ]

    instrument:
      files  : './lib/**/*.js'
      options:
        basePath: '<%=covervars.build %>/'

    reloadTasks:
      rootPath: '<%=covervars.build %>/lib/'

    storeCoverage:
      options:
        dir: '<%=covervars.reports %>/'

    makeReport:
      src    : '<%=covervars.reports %>/**/*.json'
      options:
        type : 'lcov',
        dir  : '<%=covervars.reports %>',
        print: 'detail'

    cafemocha:
      test:
        src    : './tests/server/**/*.spec.coffee'
        options:
          require    : ['./tests/common.coffee','./lib/']
          ignoreLeaks: false
          checkLeaks : true
          colors     : true
          ui         : 'bdd',
          reporter   : 'dot'

      coverage:
        src    : './tests/server/**/*.spec.coffee'
        options:
          require    : ['./tests/common.coffee','./<%=covervars.build %>/lib/']
          globals    : ['__coverage__']
          ignoreLeaks: false
          colors     : true
          ui         : 'bdd',
          reporter   : 'spec'
          coverage   :
            output: 'tests/lib-cov/coverage.html'

    karma:
      options   :
        configFile: 'tests/client/karma.conf.js'
      unit      :
        browsers : ['Firefox']
        singleRun: true
      continuous:
        browsers : ['Firefox', 'Chrome']
        singleRun: false

  grunt.loadNpmTasks 'grunt-release'
  grunt.loadNpmTasks 'grunt-karma'
  grunt.loadNpmTasks 'grunt-contrib-watch'
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-cafe-mocha'
  grunt.loadNpmTasks 'grunt-contrib-clean'
  grunt.loadNpmTasks 'grunt-istanbul'

  grunt.registerTask 'test', ['cafemocha:test']
  grunt.registerTask 'cover', [
    'coffee', 'clean',
    'instrument',
    #'reloadTasks',
    'cafemocha:coverage',
    #'storeCoverage', 'makeReport'
  ]
  grunt.registerTask 'test:continuous', ['karma:continuous']

  grunt.registerTask 'build', ['coffee', 'test']
  grunt.registerTask 'releaseit', release

  grunt.registerTask 'default', ['watch']

Инструментированный код выглядит следующим образом: http://pastebin.com/3wAt5VZT.

часть файла istanbul lcov.info (правильно сгенерированная)

TN:
SF:./lib/index.js
FNF:0
FNH:0
DA:1,1
DA:2,1
DA:10,1
DA:12,1
DA:14,1
DA:16,1
DA:18,1
DA:20,1
DA:22,1
DA:24,1
LF:10
LH:10
BRF:0
BRH:0
end_of_record

mocha, похоже, не получает тестового покрытия, но если я включу storeCoverage и makeReport, instabul покажет мне правильное количество файлов и процент кода, использованного в каждом файле. может ли mocha использовать покрытие только из jscoverage? если нет, я пропускаю какие-либо шаги?


person pocesar    schedule 23.06.2013    source источник


Ответы (2)


Я создал свой собственный плагин grunt, который делает именно это. Он выполняет mocha и передает его в Стамбул на лету через стандартный ввод. https://github.com/pocesar/grunt-mocha-istanbul и может быть установлен через нпм npm install grunt-mocha-istanbul

У него есть событие gruntjs под названием coverage, которое позволяет вам использовать сгенерированный lcov.info из инструментированного кода.

person pocesar    schedule 19.05.2014

Я заставил это работать, используя BlanketJS вместо Istanbul. Вместо того, чтобы создавать отдельные инструментированные копии ваших исходных файлов, Blanket оценивает покрытие в реальном времени, на лету.

Чтобы заставить Blanket работать с Mocha и Grunt, я написал свой собственный плагин для Grunt. Плагин поддерживает «принудительное соблюдение» минимального порога, иначе задача Grunt не будет выполнена.

Я написал сообщение в блоге со всеми подробностями здесь: http://www.geekdave.com/2013/08/02/automated-code-coverage-enforcement-for-mocha-using-grunt-and-одеяло/

person Dave Cadwallader    schedule 03.08.2013
comment
@pocesar: Как все прошло? Удалось ли вам заставить работать покрытие? - person Dave Cadwallader; 22.08.2013
comment
Я работаю над задачей grunt, которая использует Istambul и заставляет mocha использовать его через командную строку (через _mocha) вместо использования пакета mocha для grunt. - person pocesar; 23.08.2013
comment
@geek_dave Я пытаюсь заставить этот плагин grunt-blanket-mocha работать. У меня возникли проблемы с поиском документации о том, как заставить ее работать для серверных тестов в node. - person ; 13.11.2013