2016-10-03 22 views
12

Używam Angular 1.5.8. Oto mój kod:

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

    }) 
}); 

Runner testowy jest w stanie zlokalizować wszystkie pliki, więc nie jest to przypadek zapomnienia załadowania czegoś. Kiedy uruchomić ten test, nie tylko robi logStatement nigdy nie pojawiają się, otrzymuję ten błąd:

Argument 'MyController' is not a function, got undefined 

To jest mój kontroler:

(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; 
    } 
} 

})(); 

i to jest mój plik karma conf:

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

Co to oznacza? Nie mogę znaleźć niczego w dokumentacji, która by to wyjaśniła.

UPDATE:

Czytałem this answer a odpowiedź nie pracował.

+0

Jaka jest nazwa modułu zdefiniowanego przez kontroler? – segFault

+0

Proszę przeczytać fragment. ''app.my.ctrl'' – dopatraman

+0

Przeczytałem to, właśnie upewniłem się, że to było właściwe. – segFault

Odpowiedz

3

Próbując zmienić usługę wstrzykiwany w kontrolerze od scope do $scope

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

Jest to z pewnością * następny problem * OP będzie działać, ale nie bieżący :) – Phil

+0

Proszę tylko dodawać odpowiedzi, które zostały przetestowane. – dopatraman

+0

Korzystanie z kodu działa dla mnie, z wyjątkiem tej odpowiedzi. Polecam, abyś sprawdził, czy plik kontrolera .js został załadowany do procesu karmy. W tym celu otwórz przeglądarkę w url ** http: // localhost: 9876/debug.html ", używając polecenia' karma start --no-single-run' .Przypróbuj przykładowy wydruk po linii 'use strict' w twoim kontroluj konsolę.log lub sprawdź, czy kontroler został załadowany na kartę 'Źródła' w narzędziach do rozwijania Chrome .. –

1

Czy próbować dokonać pb tak proste, jak to możliwe? Wewnątrz aplikacji możesz z powodzeniem wykonać to połączenie? $controller('MyController', { $scope: $rootScope.$new()});. Jeśli to działa (tak naprawdę powinno), problem ostatecznie pochodzi z konfiguracji test/jasmin/karma/gulp/grunt i nie powinieneś już zagłębiać się w kierunek kątowy. Czy możesz rzucić okiem na to, jak definiujesz moduł app.my.ctrl w swojej aplikacji? Być może ten moduł zależy od większej liczby modułów niż tylko ui.router, którą wyśmiewasz w swoim teście. W takim przypadku moduł nie może zostać załadowany i nie można utworzyć żadnego kontrolera wewnątrz.

+0

.żadnych kości ... – dopatraman

+0

"żadnych kości" ... Nie rozumiem. Czy to oznacza, że ​​proste wywoływanie kontekstu testu nie działa? lub czy to znaczy, że twój moduł nie zawiera więcej zależności. (dla informacji definicja modułu jest jedyną ważną rzeczą, o której nie wspomniałeś w swoim poście) – 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); 
     }) 

    }) 
}); 
Powiązane problemy