Pregunta

Ejecutar mis pruebas angulares con el karma, mi aplicación se está ejecutando bien en el navegador, pero las pruebas fallan y estoy sospechando ajustes incorrectos.

Aquí están los controladores y pruebas:

// app/scripts/controllers/main.js

'use strict';

angular.module('GloubiBoulgaClientApp')
  .controller('MainCtrl', function ($scope) {

  }); 

Aquí está el archivo de prueba:

'use strict';

describe('Controller: MainCtrl', function () {

  // load the controller's module
  beforeEach(module('GloubiBoulgaClientApp'));

  var MainCtrl,
    scope;  

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl', {
      $scope: scope
    });
  }));  

  it('should attach a list of awesomeThings to the scope', function () {
    expect(true).toBe(true);
  });
});

El karma conf

module.exports = function(config) {
  config.set({
    // base path, that will be used to resolve files and exclude
    basePath: '', 

    // testing framework to use (jasmine/mocha/qunit/...)
    frameworks: ['jasmine'],

    // list of files / patterns to load in the browser
    files: [
      'app/bower_components/angular/angular.js',
      'app/bower_components/angular-mocks/angular-mocks.js',
      'app/bower_components/angular-resource/angular-resource.js',
      'app/bower_components/angular-cookies/angular-cookies.js',
      'app/bower_components/angular-sanitize/angular-sanitize.js',
      'app/scripts/*.js',
      'app/scripts/**/*.js',
      'test/mock/**/*.js',
      'test/spec/**/*.js'
    ],  

    // list of files / patterns to exclude
    exclude: [], 

    // web server port
    port: 8080,

    // level of logging
    // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
    logLevel: config.LOG_INFO,
    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,


    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: ['PhantomJS'],


    // Continuous Integration mode
    // if true, it capture browsers, run tests and exit
    singleRun: false
  });
};

El error OUPUT

 PhantomJS 1.9.2 (Linux) Controller: MainCtrl should attach a list of awesomeThings to the scope FAILED
         Error: [ng:areq] Argument 'MainCtrl' is not a function, got undefined
         http://errors.angularjs.org/1.2.8-build.2094+sha.b6c42d5/ng/areq?p0=MainCtrl&p1=not%20a%20function%2C%20got% 2
 0undefined
             at assertArg (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angula
 r.js:1362)
             at assertArgFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angu
 lar.js:1373)
             at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.js:6763
             at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/test/spec/controllers/main.js:15
             at invoke (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.j
 s:3704)
             at workFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular-mocks/angular -mocks.js:2120)

Me pregunto por qué sucede esto, intenté encontrar una documentación sobre la inicialización del karma con AngularJS. Pero la mayor documentación que encontré es solo tutorial ficticio que está repitiendo el mismo patrón (como la lista de techo de maniquí, pero con los teléfonos ...)

Parece que $ ControllerProvide.register no resuelve el nombre de My Controllers. Pero las pruebas de directivas están funcionando correctamente ...

Gracias por su atención.

Notas de edición: Reemplacé el controlador Personctrl por MainCtrl en este hilo porque estaba confundiendo a las personas sobre dónde mirar. Ahora MainCTRL es el ejemplo más simple que no encontré.

Este problema solo está afectando a mis controladores, (todos ellos), pero las pruebas de servicios y directivas están funcionando como se espera

¿Fue útil?

Solución

Resolví mi problema, he pasado casi una semana para imaginarme por qué esto no funcionaba.

Me gustaría advertirle, que karma stacktrace y informes de errores , incluso en el modo de depuración, no estaban mostrando pistas y estaban principalmente mal parezas . He pasado tiempo en JavaScript Depurador saltando marco para marcar, para entender por qué mis controladores no están cargados.(Inspeccionar el registro de controladores de Angular, mostrado que estaba vacío)

Mientras cava en mis directorios, encontré un * .js que no se cargaron en el índice en la producción, sino por el patrón de globo en las pruebas.

Fue mi viejo servicio HTTP_ERTERCEPTOR que moví, pero no golpeó el archivo. Eliminar este archivo de buggy fijo el karma raro / jazmín / comportamiento angular.

LECCIÓN APRENDIDA: No confíe en la salida de las pruebas (pero ¿en qué debo confiar entonces?). Eliminar archivos que no está usando / Testing.

Gracias a todos los que intentaron resolver este problema.

Otros consejos

Creo que el problema principal proviene del karma conf:

files: [
      'app/bower_components/angular/angular.js',
      'app/bower_components/angular-mocks/angular-mocks.js',
      'app/bower_components/angular-resource/angular-resource.js',
      'app/bower_components/angular-cookies/angular-cookies.js',
      'app/bower_components/angular-sanitize/angular-sanitize.js',
      'app/scripts/*.js',
      'app/scripts/**/*.js',
      'app/scripts/**/**/*.js',
      'test/mock/**/*.js',
      'test/spec/**/*.js'
    ],  

Extracción del * y especificando archivos uno por uno en el orden correcto, porque si uno se carga antes de otro, puede romper.

Editar: Agregue sus archivos en el mismo orden que su índice.html

Mirando esto Me pregunto si el mensaje de error es confuso las cosas.

en la traza de pila puedo ver

TypeError: 'undefined' is not an object (evaluating 'scope.awesomeThings.length')

y del ejemplo parece que no ha definido ninguna propiedad en el alcance en su controlador.

¿Todavía tiene el problema si agrega

$scope.awesomeThings = []; 

¿A su controlador?

Si está utilizando la última angular y también usando el módulo de ruta angular , debe incluir el script de ruta angular en el archivo karma confes:

files: [
  'app/bower_components/angular/angular.js',
  'app/bower_components/angular-route/angular-route.js',
  'app/bower_components/angular-mocks/angular-mocks.js',
  'app/bower_components/angular-resource/angular-resource.js',
  'app/bower_components/angular-cookies/angular-cookies.js',
  'app/bower_components/angular-sanitize/angular-sanitize.js',
  'app/scripts/*.js',
  'app/scripts/**/*.js',
  'app/scripts/**/**/*.js',
  'test/mock/**/*.js',
  'test/spec/**/*.js'
],  

Tuve este problema y lo agregó al archivo de Karma hizo el truco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top