Pruebas unitarias de AngularJS: tutorial de Karma Jasmine
Una de las caracterรญsticas mรกs brillantes de Angular.JS es la Pruebas aspecto. Cuando los desarrolladores en Google Al desarrollar AngularJS, tuvieron en cuenta las pruebas y se aseguraron de que todo el marco de trabajo de AngularJS fuera comprobable.
En AngularJS, las pruebas normalmente se realizan utilizando Karma (framework). Las pruebas de Angular JS se pueden realizar sin Karma, pero el marco Karma tiene una funcionalidad tan brillante para probar el cรณdigo AngularJS que tiene sentido utilizar este marco.
- En AngularJS, podemos realizar Examen de la unidad por separado para controladores y directivas.
- Tambiรฉn podemos realizar pruebas de extremo a extremo de AngularJS, que son pruebas desde la perspectiva del usuario.
Introducciรณn e instalaciรณn del marco Karma.
Karma es un herramienta de automatizaciรณn de pruebas creado por el equipo de Angular JS en GoogleEl primer paso para usar Karma es instalarlo. Karma se instala mediante npm (un gestor de paquetes que facilita la instalaciรณn de mรณdulos en una mรกquina local).
Instalaciรณn del Karma
La instalaciรณn de Karma a travรฉs de npm se realiza en un proceso de dos pasos.
Paso 1) Ejecute la siguiente lรญnea desde la lรญnea de comando
npm install karma karma-chrome-launcher karma-jasmine
Donde,
- npm es la utilidad de lรญnea de comandos para el administrador de paquetes de nodos que se utiliza para instalar mรณdulos personalizados en cualquier mรกquina.
- El parรกmetro de instalaciรณn indica a la utilidad de lรญnea de comando npm que se requiere instalaciรณn.
- Hay 3 bibliotecas especificadas en la lรญnea de comando que son necesarias para trabajar con karma.
- karma es la biblioteca principal que se utilizarรก con fines de prueba.
- karma-chrome-launcher es una biblioteca separada que permite que el navegador Chrome reconozca los comandos karma.
- karma-jasmine: esto instala jasmine, que es un marco dependiente de Karma.
Paso 2) El siguiente paso es instalar la utilidad de lรญnea de comandos karma. Esto es necesario para ejecutar comandos de lรญnea de karma. La utilidad karma line se utilizarรก para inicializar el entorno de karma para realizar pruebas.
Para instalar la utilidad de lรญnea de comando, ejecute la siguiente lรญnea desde la lรญnea de comando
npm install karma-cli
donde,
Configuraciรณn del marco Karma.
El siguiente paso es configurar karma, lo cual se puede hacer mediante el comando
"karma โinit"
Despuรฉs de ejecutar el paso anterior, karma crearรก un archivo karma.conf.js. El archivo probablemente se verรก como el fragmento que se muestra a continuaciรณn.
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Los archivos de configuraciรณn anteriores le indican al motor de ejecuciรณn de Karma lo siguiente
- 'Nombre de su aplicaciรณn' โ Esto serรก reemplazado por el nombre de su aplicaciรณn.
- "Nombre de su aplicaciรณn '/AngularJS/AngularJS.js' โ Esto le dice a karma que su aplicaciรณn depende de los mรณdulos principales en AngularJS
- 'Nombre de su aplicaciรณn'/AngularJS-mocks/AngularJS-mocks.js' โ Esto le dice a karma que use la funcionalidad de prueba unitaria para AngularJS desde el archivo Angular.JS-mocks.js.
- Todos los archivos principales de la aplicaciรณn o de la lรณgica empresarial estรกn presentes en la carpeta lib de su aplicaciรณn.
- La carpeta de pruebas contendrรก todas las pruebas unitarias.
Para comprobar si karma estรก funcionando, cree un archivo llamado Sample.js, ingrese el siguiente cรณdigo y colรณquelo en el directorio de prueba.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
El cรณdigo anterior tiene los siguientes aspectos
- La funciรณn de descripciรณn se utiliza para dar una descripciรณn de la prueba. En nuestro caso, le damos la descripciรณn "Prueba de muestra" a nuestra prueba.
- La funciรณn 'it' se utiliza para darle un nombre a la prueba. En nuestro caso, le damos el nombre a nuestra prueba como "La condiciรณn es verdadera". El nombre de la prueba debe ser significativo.
- La combinaciรณn de las palabras clave "esperar" y "toBe" indica cuรกl es el valor esperado y real del resultado de la prueba. Si el valor real y el esperado son iguales, entonces la prueba pasarรก, de lo contrario fallarรก.
Cuando ejecute la siguiente lรญnea en el sรญmbolo del sistema, se ejecutarรก el archivo de prueba anterior
KARMA start
El siguiente resultado estรก tomado del IDE. Webstorm en el que se llevaron a cabo los pasos anteriores.
- La salida viene en el explorador Karma dentro Webstorm. Esta ventana muestra la ejecuciรณn de todas las pruebas definidas en el marco de karma.
- Aquรญ puede ver que se muestra la descripciรณn de la prueba ejecutada que es โPrueba de muestraโ.
- A continuaciรณn, puede ver que se ejecuta la prueba en sรญ que tiene el nombre "La condiciรณn es verdadera".
- Tenga en cuenta que todas las pruebas tienen el รญcono verde "Aceptar" al lado, lo que simboliza que todas las pruebas pasaron.
Prueba de controladores AngularJS
El marco de prueba de karma tambiรฉn tiene la funcionalidad de probar los controladores de un extremo a otro. Esto incluye pruebas del objeto $scope que se utiliza dentro de los Controladores.
Veamos un ejemplo de cรณmo podemos lograrlo.
En nuestro ejemplo,
Primero necesitarรญamos definir un controlador. Este controlador llevarรญa a cabo los pasos mencionados a continuaciรณn.
- Cree una variable ID y asรญgnele el valor 5.
- Asigne la variable ID al objeto $scope.
Nuestra prueba comprobarรก la existencia de este controlador y tambiรฉn comprobarรก si la variable ID del objeto $scope estรก configurada en 5.
Primero debemos asegurarnos de que se cumpla el siguiente requisito previo
Instale la biblioteca Angular.JS-mocks a travรฉs de npm. Esto se puede hacer ejecutando la siguiente lรญnea en el sรญmbolo del sistema
npm install Angular JS-mocks
Lo siguiente es modificar el archivo karma.conf.js para garantizar que se incluyan los archivos correctos para la prueba. El siguiente segmento solo muestra los archivos que forman parte de karma.conf.js que deben modificarse
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- El parรกmetro "archivos" bรกsicamente le dice a Karma todos los archivos necesarios para la ejecuciรณn de las pruebas.
- Los archivos AngularJS.js y AngularJS-mocks.js son necesarios para ejecutar pruebas unitarias de AngularJS.
- El archivo index.js contendrรก nuestro cรณdigo para el controlador
- La carpeta de prueba contendrรก todas nuestras pruebas de AngularJS.
A continuaciรณn se muestra nuestro cรณdigo Angular.JS que se almacenarรก como un archivo Index.js en la carpeta de prueba de nuestra aplicaciรณn.
El cรณdigo siguiente simplemente hace lo siguiente:
- Crear una Mรณdulo AngularJS llamada aplicaciรณn de muestra
- Crea un controlador llamado AngularJSController
- Crea una variable llamada ID, dale un valor de 5 y asรญgnala al objeto $scope
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Una vez que el cรณdigo anterior se ejecute correctamente, el siguiente paso serรญa crear un Caso de prueba para garantizar que el cรณdigo se haya escrito y ejecutado correctamente.
El cรณdigo para nuestra prueba serรก el que se muestra a continuaciรณn.
El cรณdigo estarรก en un archivo independiente llamado ControllerTest.js, que se colocarรก en la carpeta de pruebas. El cรณdigo que aparece a continuaciรณn solo realiza las siguientes tareas clave:
- Funciรณn beforeEach: esta funciรณn se utiliza para cargar nuestro mรณdulo AngularJS.JS llamado "sampleApp" antes de la ejecuciรณn de la prueba. Tenga en cuenta que este es el nombre del mรณdulo en un archivo index.js.
- El objeto $controller se crea como un objeto de maqueta para el controlador "Angular JSController" que estรก definido en nuestro archivo index.js. En cualquier tipo de prueba unitaria, un objeto simulado representa un objeto ficticio que realmente se utilizarรก para la prueba. Este objeto simulado en realidad simularรก el comportamiento de nuestro controlador.
- beforeEach(inject(function(_$controller_): esto se usa para inyectar el objeto simulado en nuestra prueba para que se comporte como el controlador real.
- var $ alcance = {}; Este es un objeto simulado que se estรก creando para el objeto $scope.
- controlador var = $controlador('AngularJSController', { $alcance: $alcance }); โ Aquรญ estamos comprobando la existencia de un controlador llamado 'Angular.JSController'. Aquรญ tambiรฉn estamos asignando todas las variables de nuestro objeto $scope en nuestro controlador en el archivo Index.js al objeto $scope en nuestro archivo de prueba.
- Finalmente, estamos comparando $scope.ID con 5
describe('AngularJSController', function() {
beforeEach(module('sampleApp'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('$scope.ID', function() {
it('Check the scope object', function() {
var $scope = {};
var controller = $controller('AngularJSController', { $scope: $scope });
expect($scope.ID).toEqual(5);
});
});
});
La prueba anterior se ejecutarรก en el navegador karma y darรก el mismo resultado que se mostrรณ en el tema anterior.
Prueba de directivas AngularJS
El marco de pruebas Karma tambiรฉn tiene la funcionalidad para probar directivas personalizadas. Esto incluye la plantilla.URLque se utilizan dentro de directivas personalizadas.
Veamos un ejemplo de cรณmo podemos lograrlo.
En nuestro ejemplo, primero definiremos una directiva personalizada que hace lo siguiente
- Cree un mรณdulo AngularJS llamado sampleApp
- Cree una directiva personalizada con el nombre โ Guru99
- Cree una funciรณn que devuelva una plantilla con una etiqueta de encabezado que muestre el texto "Esto es prueba de AngularJS".
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Una vez que el cรณdigo anterior se ejecute correctamente, el siguiente paso serรญa crear un caso de prueba para garantizar que el cรณdigo se haya escrito y ejecutado correctamente. El cรณdigo para nuestra prueba serรก el que se muestra a continuaciรณn.
El cรณdigo estarรก en un archivo independiente llamado DirectiveTest.js, que se colocarรก en la carpeta de pruebas. El cรณdigo que aparece a continuaciรณn solo realiza las siguientes tareas clave:
- Funciรณn beforeEach: esta funciรณn se utiliza para cargar nuestro mรณdulo Angular JS llamado "sampleApp" antes de la ejecuciรณn de la prueba.
- El servicio $compile se utiliza para compilar la directiva. Este servicio es obligatorio y debe declararse para que Angular.JS pueda usarlo para compilar nuestra directiva personalizada.
- El $rootscope es el alcance principal de cualquier aplicaciรณn AngularJS.JS. Hemos visto el objeto $scope del controlador en capรญtulos anteriores. Bueno, el objeto $scope es el objeto hijo del objeto $rootscope. La razรณn por la que esto se declara aquรญ es porque estamos realizando un cambio en una etiqueta HTML real en el DOM a travรฉs de nuestra directiva personalizada. Por lo tanto, necesitamos usar el servicio $rootscope que realmente escucha o sabe cuรกndo ocurre algรบn cambio dentro de un documento HTML.
- var elemento = $compile(โGuru99>Guru99>โ) โ Esto se utiliza para comprobar si nuestra directiva se inyecta como deberรญa. El nombre de nuestra directiva personalizada es Guru99, y sabemos por nuestro capรญtulo de directivas personalizadas que cuando la directiva se inyecta en nuestro HTML, se inyectarรก como 'Guru99>Guru99>'. Por lo tanto, esta instrucciรณn se utiliza para realizar esa verificaciรณn.
- expect(element.html()).toContain(โEsto es prueba de AngularJSโ): esto se usa para indicarle a la funciรณn expect que debe encontrar el elemento (en nuestro caso, la etiqueta div) que contenga el texto HTML interno de โEsto es Pruebas de AngularJSโ.
describe('Unit testing directives', function() {
var $compile,
$rootScope;
beforeEach(module('sampleApp'));
beforeEach(inject(function(_$compile_, _$rootScope_){
$compile = _$compile_;
$rootScope = _$rootScope_;
}));
it('Check the directive', function() {
// Compile a piece of HTML containing the directive
var element = $compile("<ng-Guru99></ng-Guru99>")($rootScope);
$rootScope.$digest();
expect(element.html()).toContain("This is AngularJS Testing");
});
});
La prueba anterior se ejecutarรก en el navegador karma y darรก el mismo resultado que se mostrรณ en el tema anterior.
Pruebas de extremo a extremo de aplicaciones AngularJS JS
El marco de pruebas de karma junto con un marco llamado ProtracTor tiene la funcionalidad de probar una aplicaciรณn web de principio a fin.
Por lo tanto, no se trata solo de probar directivas y controladores, sino tambiรฉn de cualquier otra cosa que pueda aparecer en una pรกgina HTML.
Veamos un ejemplo de cรณmo podemos lograrlo.
En nuestro ejemplo a continuaciรณn, tendremos una aplicaciรณn AngularJS que crea una tabla de datos usando la directiva ng-repeat.
- Primero, creamos una variable llamada "tutorial" y le asignamos algunos pares clave-valor en un solo paso. Cada par clave-valor se utilizarรก como datos al mostrar la tabla. Luego, la variable del tutorial se asigna al objeto de alcance para que se pueda acceder a รฉl desde nuestra vista.
- Para cada fila de datos de la tabla, utilizamos la directiva ng-repeat. Esta directiva revisa cada par clave-valor en el objeto de alcance del tutorial utilizando la variable ptutor.
- Finalmente, estamos usando el etiqueta junto con los pares clave-valor (ptutor.Name y ptutor.Description) para mostrar los datos de la tabla.
<table >
<tr ng-repeat="ptutor in tutorial">
<td>{{ ptutor.Name }}</td>
<td>{{ ptutor.Description }}</td>
</tr>
</table>
</div>
<script type="text/javascript">
var app = AngularJS.module('DemoApp', []);
app.controller('DemoController', function($scope) {
$scope.tutorial =[
{Name: "Controllers" , Description : "Controllers in action"},
{Name: "Models" , Description : "Models and binding data"},
{Name: "Directives" , Description : "Flexibility of Directives"}
] });
Una vez que el cรณdigo anterior se ejecute correctamente, el siguiente paso serรญa crear un caso de prueba para garantizar que el cรณdigo se haya escrito y ejecutado correctamente. El cรณdigo para nuestra prueba serรก el que se muestra a continuaciรณn.
En realidad, nuestra prueba probarรก la directiva ng-repeat y garantizarรก que contenga 3 filas de datos como deberรญa en el ejemplo anterior.
Primero debemos asegurarnos de que se cumpla el siguiente requisito previo
Instala el protracLibrerรญa Tor a travรฉs de npm. Esto se puede hacer ejecutando la siguiente lรญnea en la lรญnea de comandos.
"npm install protractor"
El cรณdigo para nuestra prueba serรก el que se muestra a continuaciรณn.
El cรณdigo estarรก en un archivo independiente llamado CompleteTest.js, que se colocarรก en la carpeta de pruebas. El cรณdigo que aparece a continuaciรณn solo realiza las siguientes tareas clave:
- La funciรณn del navegador la proporciona el protracLa biblioteca tor asume que nuestra aplicaciรณn AngularJS (con el cรณdigo mostrado arriba) se estรก ejecutando en nuestro sitio. URL โ http://localhost:8080/Guru99 /
- var list=element.all(by.repeater(ptutor in tutorial')); -Esta lรญnea de cรณdigo en realidad obtiene la directiva ng-repeat que se rellena con el cรณdigo 'ptutor in tutorial'. El elemento y by.repeater son palabras clave especiales proporcionadas por el protracBiblioteca Tor que nos permite obtener detalles de la directiva ng-repeat.
- esperar(lista.count()).toEqual(3); โ Por รบltimo, estamos usando la funciรณn expect para ver que, de hecho, estamos completando 3 elementos en nuestra tabla como resultado de la directiva ng-repeat.
Describe('Unit testing end to end', function() {
beforeEach(function() {
browser.get('http://localhost:8080/Guru99/');
})
it('Check the ng directive', function() {
var list=element.all(by.repeater(ptutor in tutorial'));
expect(list.count()).toEqual(3); }); });
La prueba anterior se ejecutarรก en el navegador karma y darรก el mismo resultado que se mostrรณ en el tema anterior.
Resumen
- Las pruebas en AngularJS se realizan utilizando el framework karma, un framework que ha sido desarrollado por Google misma.
- El marco karma se instala utilizando el administrador de paquetes de nodos. Los mรณdulos clave que se deben instalar para las pruebas bรกsicas son karma, karma-chrome-launcher, karma-jasmine y karma-cli.
- Las pruebas se escriben en archivos js separados, que normalmente se guardan en la carpeta de pruebas de su aplicaciรณn. La ubicaciรณn de estos archivos de prueba debe mencionarse en un archivo de configuraciรณn especial llamado karma.conf.js. Karma usa este archivo de configuraciรณn al ejecutar todas las pruebas.
- Karma tambiรฉn se puede utilizar para probar controladores y directivas personalizadas.
- Para una prueba web de extremo a extremo, otro marco llamado protracTor debe instalarse mediante el gestor de paquetes de Node. Este framework proporciona mรฉtodos especiales que permiten probar todos los elementos de una pรกgina HTML.

