2016-10-03 1 views
12

Ich benutze Angular 1.5.8. Hier ist mein Code:

describe('My Controller', function() { 
    var MyController; 
    var $controller; 
    var $rootScope; 
    var $state; 

    beforeEach(angular.mock.module('ui.router')); 
    beforeEach(module('app.my.ctrl')); 
    beforeEach(inject(function(_$controller_, _$rootScope_, _$state_) { 
     $controller = _$controller_; 
     $rootScope = _$rootScope_; 
     $state = _$state_; 
     MyController = $controller('MyController', { scope: $rootScope.$new() }); 
    })); 

    describe('#init', function() { 
     it('should do something', function() { 
      console.log('logStatement', MyController); 

      MyController.init(); 

      expect(true).toBe(true); 
     }) 

    }) 
}); 

Der Test Läufer ist in der Lage, alle Dateien zu finden, so dass dies ist nicht ein Fall von etwas vergessen zu laden. Wenn ich diesen Test ausführen, nicht nur die logStatement nie erscheinen, ich diesen Fehler:

Argument 'MyController' is not a function, got undefined 

Dies ist mein Controller:

(function() { 
'use strict'; 

angular 
    .module('app.my.ctrl') 
    .controller('MyController', MyController); 

MyController.$inject = [ 
    '$scope' 
]; 
/* ngInject */ 
function MyController($scope) { 

    var vm = this; 

    vm.hello = 'world'; 

    vm.init = function() { 
     return true; 
    } 
} 

})(); 

und das ist mein Karma conf-Datei:

// Karma configuration 

module.exports = function(config) { 
    config.set({ 

    // base path that will be used to resolve all patterns (eg. files, exclude) 
    basePath: '', 


    // frameworks to use 
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 
    frameworks: ['jasmine'], 


    // list of files/patterns to load in the browser 
    files: [ 
     'bower_components/angular/angular.js', 
     'bower_components/angular-mocks/angular-mocks.js', 
     'bower_components/angular-ui-router/release/angular-ui-router.js', 
     'src/controllers/MyController.js', 
     'tests/unit/**/*.spec.js', 
    ], 


    // list of files to exclude 
    exclude: [ 
     '**/*.swp' 
    ], 


    // preprocess matching files before serving them to the browser 
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 
    preprocessors: { 
    }, 


    // test results reporter to use 
    // possible values: 'dots', 'progress' 
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter 
    reporters: ['spec'], 

    // Spec Reporter Config 
    specReporter: { 
    //  suppressErrorSummary: false, 
    //  suppressFailed: false, 
    //  suppressPassed: false, 
     suppressSkipped: true 
    //  showSpecTiming: false 
    }, 


    // web server port 
    port: 9876, 


    // enable/disable colors in the output (reporters and logs) 
    colors: true, 


    // level of logging 
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 
    logLevel: config.LOG_INFO, 


    // enable/disable watching file and executing tests whenever any file changes 
    autoWatch: true, 


    // start these browsers 
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 
    browsers: ['Chrome'], 


    // Continuous Integration mode 
    // if true, Karma captures browsers, runs the tests and exits 
    singleRun: true, 

    // Concurrency level 
    // how many browser should be started simultaneous 
    concurrency: Infinity 
    }) 
}; 

Was bedeutet das? Ich kann nichts in der Dokumentation finden, die das erklären würde.

UPDATE:

ich gelesen habe this answer und die Antwort hat nicht funktioniert.

+0

Wie lautet der Name des Moduls, unter dem der Controller definiert ist? – segFault

+0

Bitte lesen Sie das Snippet. ''app.my.ctrl'' – dopatraman

+0

Ich habe das gelesen, wollte nur sicherstellen, dass das richtig war. – segFault

Antwort

3

Der Versuch, den Dienst in der Controller von scope zu $scope

beforeEach(inject(function(_$controller_, _$rootScope_, _$state_) { 
     $controller = _$controller_; 
     $rootScope = _$rootScope_; 
     $state = _$state_; 
     MyController = $controller('MyController', { $scope: $rootScope.$new()}); 
})); 
+0

Dies ist sicherlich das * nächste Problem * OP wird in aber nicht die aktuelle laufen :) – Phil

+0

Bitte nur Antworten, die getestet wurden. – dopatraman

+0

Mit Ihrem Code funktioniert für mich außer durch diese Antwort. Ich empfehle Ihnen, zu überprüfen, ob Ihre Controller-JS-Datei in den Karma-Prozess geladen wurde. Öffnen Sie hierzu Ihren Browser in der URL ** http: // localhost: 9876/debug.html "mit dem Befehl' karma start --no-single-run'. Versuchen Sie es mit dem Beispiel print nach der Zeile 'use strict' in Ihrem Kontrollieren Sie eine console.log oder überprüfen Sie, ob der Controller auf der Registerkarte 'Quellen' in den Chrome-Entwicklungstools geladen wurde. –

1

Haben Sie versucht, injiziert ändern Sie Ihre pb so einfach wie möglich zu machen? In der Anwendung können Sie diesen Anruf erfolgreich durchführen? $controller('MyController', { $scope: $rootScope.$new()});. Wenn das funktioniert (sollte es tatsächlich), kommt das Problem definitiv von deiner Test/Jasmin/Karma/Schluck/Grunz Konfiguration und du solltest nicht mehr in Winkelrichtung graben. Können Sie uns einen Blick darauf werfen, wie Sie das Modul app.my.ctrl in Ihrer Anwendung definieren? Vielleicht hängt dieses Modul von mehr Modulen ab als nur ui.router, die Sie in Ihrem Test vortäuschen. Wenn dies der Fall ist, kann das Modul nicht geladen werden und es kann auch kein Controller darin erstellt werden.

+0

yes .kein Würfel ... – dopatraman

+0

"kein Würfel" ... Ich verstehe nicht. Bedeutet das, dass der einfache Aufruf aus dem Testkontext nicht funktioniert? oder bedeutet es, dass Ihr Modul keine weiteren Abhängigkeiten enthält. (Zur Information ist die Moduldefinition die einzige wichtige Sache, die Sie in Ihrem Beitrag nicht erwähnt haben) – Stephane

0
describe('My Controller', function() { 
    var MyController; 
    var scope; 

    beforeEach(angular.mock.module('ui.router')); 
    beforeEach(module('app.my.ctrl')); 
    beforeEach(inject(function($rootScope) { 
     scope = $rootScope.$new(); 
    })); 

    describe('#init', function() { 
     it('should do something', function($componentController) { 
      var MyController = $componentController('MyController', { 
       $scope : scope 
      }); 
      MyController.init(); 

      expect(true).toBe(true); 
     }) 

    }) 
}); 
Verwandte Themen