Búsqueda de sitios web

gruntjs - Pruebas de Typescript, con Karma, Jasmine y Grunt


He estado intentando usar Karma+Jasmine para ejecutar pruebas escritas en TypeScript.

Buscando en línea, parece que bastantes han logrado tal hazaña, pero no pude encontrar una guía completa sobre cómo hacerlo. El entorno:

  • Typescript usando módulos ES6
  • Karma
  • Jazmín
  • Gruñido

¿Cómo se configura todo el asunto?

Respuesta #1

Consulta este repositorio de GitHub para el código fuente completo.

package.json

Comencemos con devDependencies:

"devDependencies": {
    "grunt": "^0.4.5",
    "grunt-contrib-watch": "^0.6.1",
    "grunt-karma": "^0.12.1",
    "grunt-ts": "^5.1.0",
    "jasmine-core": "^2.3.4",
    "karma": "^0.13.15",
    "karma-jasmine": "^0.3.6",
    "karma-phantomjs-launcher": "^0.2.1",
    "karma-requirejs": "^0.2.3",
    "load-grunt-tasks": "^3.3.0",
    "phantomjs": "^1.9.18",
    "requirejs": "^2.1.22"
}

Gruntfile.js

Reloj

Observamos todos los archivos .ts, y al cambiar, primero los transpilamos, luego ejecutamos las pruebas:

watch: {
    typescript: {
        // Watching all typescript files (specs and units)
        files: [ 'source/**/*.ts' ],
        // First transpile, then run tests
        tasks: [ 'ts:default', 'karma:continuous:run' ],
        options: {
            spawn: false
        }
    }
},

Compilación de Typescript

Transpilamos todos los archivos .ts usando el módulo amd. Ten en cuenta que necesitamos las tipificaciones de jasmine:

ts: {
    default: {
        src: [
            // Note that we add the typings for jasmine here
            'typings/jasmine.d.ts',
            // We compile all .ts files (specs and units)
            'source/**/*.ts'
        ],
        options: {
            // We need to convert ES6 to ES5 and use amd so it works
            // with RequireJS
            module: 'amd',
            fast: 'never'
        },
        // We output all files to a temp folder
        outDir: 'transpiled'
    }
},

Karma

Una vez que todos los archivos .ts estén en la carpeta transpiled, podemos ejecutar las pruebas de Karma:

karma: {
    options: {
        configFile: 'karma.conf.js'
    },

    continuous: {
        logLevel:  'INFO',
        singleRun: false,
    }
}

karma.conf.js

La parte más complicada:

  • Añadimos requirejs como un framework.
  • Cargamos todos los archivos transpilados, pero con el indicador include establecido en falso.
  • Un archivo llamado test-main.js luego escanea estos archivos y carga dinámicamente todos los archivos .spec para las pruebas. test-main.js fue generado por Karma, consulta esta guía para más información.

Así:

module.exports = function(config) {
    config.set({
        // Note that we also use `requirejs`
        frameworks: [ 'jasmine', 'requirejs' ],

        files: [
            // We add all transpiled files (specs and unit) with included set
            // to false.
            { pattern: 'transpiled/**/*.js', included: false },

            // Test main will search the files for specs and load them
            // dynamically.
            'test-main.js'
        ],

        reporters: [ 'progress' ],

        browsers: [ 'PhantomJS' ],

        autoWatch: false,
        singleRun: true
    })
}

Respuesta #2

Echa un vistazo a usar el preprocesador karma-typescript, lo cual podría ser un poco más fácil que ver, compilar y luego ejecutar las pruebas.

Esto se puede configurar bastante fácilmente en tus configuraciones de karma y/o grunt.