Question

Je gère mes tests angulaires avec karma, mon application fonctionne bien dans le navigateur, mais les tests échouent et je soupçonne de mauvais paramètres.

Voici les contrôleurs et les tests:

// app/scripts/controllers/main.js

'use strict';

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

  }); 

Voici le fichier de test:

'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);
  });
});

Le 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
  });
};

L'erreur 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)

Je me demande pourquoi cela se produit, j'ai essayé de trouver une documentation sur l'initialisation du karma avec angularjs. Mais la plus documentation que j'ai trouvée n'est que le tutoriel factice qui répète le même motif (comme la liste mannequin ToDo, mais avec des téléphones ...)

Il semble que $ contrôleurprovide.register échoue pour résoudre le nom de mon contrôleur. Mais les tests de directives fonctionnent correctement ...

Merci de votre attention.

Modifier les notes: J'ai remplacé le contrôleur PersonCtrl par MAINCTRL dans ce fil car il confondait des gens sur où regarder. Maintenant Mainctrl est l'exemple le plus simple que j'ai trouvé.

Ce problème n'affecte que mes contrôleurs (tous), mais les tests de services et directives fonctionnent comme prévu

Était-ce utile?

La solution

J'ai résolu mon problème, j'ai passé près d'une semaine pour comprendre pourquoi cela ne fonctionnait pas.

J'aimerais vous avertir, que Karma StackTrace et Rapports d'erreur , même en mode de débogage, n'apparaissions pas des indices et étaient principalement malaxés . J'ai passé du temps dans le débogueur JavaScript à sauter un cadre pour encadrer, pour comprendre pourquoi mes contrôleurs où ne sont pas chargés.(Inspection du registre des contrôleurs de l'angulaire, montré qu'il était vide)

En creuser dans mes répertoires, j'ai trouvé un * .js qui n'étaient pas chargés dans l'indice de production, mais par le modèle de globe dans les tests.

c'était mon ancien service http_interceptor que j'ai déplacé mais n'a pas détruit le fichier. Suppression de ce fichier de buggy fixe le comportement étrange karma / jasmin / angulaire.

Leçon apprise: Ne faites pas confiance à des tests (mais que dois-je faire confiance à ce moment-là?). Supprimer les fichiers que vous n'utilisez pas / teste.

Merci à tous ceux qui ont essayé de résoudre ce problème.

Autres conseils

Je pense que le problème principal provient du 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'
    ],  

Suppression des fichiers * et spécifier des fichiers un par un dans le bon ordre, car si l'on est chargé avant d'un autre, il peut se casser.

Edit: Ajoutez vos fichiers dans le même ordre que votre index.html

Regardant cela, je me demande si le message d'erreur est confus.

dans la trace de la pile, je peux voir

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

et de l'exemple, il semble que vous n'ayez pas défini de propriétés sur la portée de votre contrôleur.

Avez-vous toujours le problème si vous ajoutez

$scope.awesomeThings = []; 

à votre contrôleur?

Si vous utilisez le dernier angulaire et également à l'aide de Module d'itinéraire angulaire , vous devez inclure le script angulaire dans le fichier Conf de Karma:

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'
],  

J'ai eu ce problème et l'ajout au fichier Karma a fait le tour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top