angularjs - unitarias - test jasmine angular 2
¿Cómo puedo automatizar las pruebas E2E y unitarias con Yeoman & AngularJS? (4)
Estoy usando Yeoman y generator-angular para administrar aplicaciones AngularJS, pero estoy teniendo problemas con las pruebas automatizadas.
La ejecución de la grunt test
ejecutará las pruebas unitarias una vez. Puedo hacer que las pruebas E2E se ejecuten después de las pruebas unitarias al alterar el bloque de configuración de karma en Gruntfile.js
, agregando e2e:
karma: {
//...
e2e: {
configFile: ''karma-e2e.conf.js'',
singleRun: true
}
},
Genial: ahora cuando grunt test
, se ejecutan todas las pruebas. Pero solo se ejecutan una vez, y hay una gran sobrecarga (brújula inicial, ejecución del servidor, inicio de los procesos de Chrome, etc.). En su lugar, el servidor y los procesos de Chrome deben seguir en ejecución y, cuando guarde una prueba, las pruebas deben volver a ejecutarse.
Puedo lograr esto modificando tanto karma.conf.js
como karma-e2e.conf.js
y estableciendo singleRun = true
, luego ejecutando karma start
en un panel de terminal, y karma start karma-e2e.conf.js
en otro. Si ninguno de los puertos en el conflicto de configuraciones de karma (que lo hacen por defecto), esto funciona. Ahora estoy pasando por alto a Grunt y simplemente estoy haciendo lo mío (lo que parece un poco tonto, ya que se supone que Grunt facilitará las cosas).
De todos modos, después de unos pocos cambios más (¿correcciones?) - no se detalla por brevedad - esto funciona pero no funciona: ahora tengo que ejecutar dos comandos diferentes y estar pendiente de dos paneles de terminales diferentes. Sin duda hay una mejor manera.
¿Cómo puedo ejecutar un solo comando para ver mis archivos de prueba y volver a ejecutar las pruebas de manera apropiada?
Pregunta de bonificación: ¿por qué en la Tierra no se proporciona esta funcionalidad tal cual? ¿Es solo una cuestión de que los desarrolladores de generador angular no tengan suficiente tiempo para implementar esto? Pregunto porque acabo de entrar en Angular / Yeoman / Karma (como probablemente habrás notado) y considero que las pruebas automatizadas de E2E y las pruebas unitarias son cruciales para el flujo de trabajo.
Como mencioné en un comentario a su pregunta, PhantomJS ahorra muchas molestias. Aparte de eso, creo que puedes manejar todo desde tu Gruntfile y simplemente continuar ejecutando la grunt test
ronca para comenzar todo.
grunt-karma permite la personalización completa de tus opciones de karma con algunos complementos útiles.
De los documentos:
....
Puede anular cualquiera de las configuraciones del archivo de configuración directamente:
karma: { unit: { configFile: ''karma.conf.js'', runnerPort: 9999, singleRun: true, browsers: [''PhantomJS''] } }
Compartir las configuraciones
Si tiene objetivos múltiples, puede ser útil compartir configuraciones comunes entre ellos. Grunt-karma admite esto utilizando la propiedad de opciones:
karma: { options: { configFile: ''karma.conf.js'', runnerPort: 9999, browsers: [''Chrome'', ''Firefox''] }, continuous: { singleRun: true browsers: [''PhantomJS''] }, dev: { reporters: ''dots'' } }
Además, es posible que desee husmear en el código Gruntfile generador de angular de Yeoman para ver qué más puede estar disponible o al menos burlarse.
Dentro del archivo karma.conf.js (línea aproximada: 38) encuentra autoWatch = false; y cambiarlo a verdadero
Ahora, si ejecuta roncado karma: unit, encontrará que deja ejecutándose el servidor de prueba y cualquier cambio en los archivos de proyecto ejecutará las pruebas inmediatamente.
Puede intentar esto para ejecutar solo pruebas e2e
grunt karma:e2e
//
// test/midway/appSpec.js
//
describe("Midway: Testing Modules", function() {
describe("App Module:", function() {
var module;
before(function() {
module = angular.module("App");
});
it("should be registered", function() {
expect(module).not.to.equal(null);
});
describe("Dependencies:", function() {
var deps;
var hasModule = function(m) {
return deps.indexOf(m) >= 0;
};
before(function() {
deps = module.value(''appName'').requires;
});
//you can also test the module''s dependencies
it("should have App.Controllers as a dependency", function() {
expect(hasModule(''App.Controllers'')).to.equal(true);
});
it("should have App.Directives as a dependency", function() {
expect(hasModule(''App.Directives'')).to.equal(true);
});
it("should have App.Filters as a dependency", function() {
expect(hasModule(''App.Filters'')).to.equal(true);
});
it("should have App.Routes as a dependency", function() {
expect(hasModule(''App.Routes'')).to.equal(true);
});
it("should have App.Services as a dependency", function() {
expect(hasModule(''App.Services'')).to.equal(true);
});
});
});
});