2016-06-03 3 views
0

Это для работы (у меня есть разрешение), поэтому я не могу отправить точный код.Работа с зависимостями в angularjs Тестирование

Поэтому я должен проверить контроллеры большого модуля. Модуль имеет большую конфигурационную функцию с множеством контроллеров для логики разных страниц.

Для фактического применения он загружен беседкой, которая раздражает, так как я тестирую Karma-Browserify и npm. Таким образом, зависимости - беспорядок. Я в основном должен импортировать все, что было загружено с bower.json в package.json.

Это мой karma.conf.js:

module.exports = function(config) { 
    config.set({ 
    basePath: 'resources', 
    browserify: { 
     debug: true, 
     transform: [ 'browserify-shim' ] 
    }, 
    browsers: [ 'PhantomJS' ], 
    captureTimeout: 60000, 
    client: { 
     mocha: {} 
    }, 
    files: [ 
     'tests/assist/test.js', 
     'assets/scripts/libs/logger.min.js' 
    ], 
    frameworks: [ 'browserify', 'phantomjs-shim', 'mocha', 'chai' ], 
    port: 8080, 
    preprocessors: { 
     'tests/assist/controller.js': [ 'browserify' ] 
    }, 
    reporters: [ 'mocha', 'coverage' ], 
    singleRun: true 
    }); 
}; 

Поэтому код ниже это мой test.js (удаление некоторых названий конкретных компаний). Также мне нужно поставить angular.mock. или он не будет работать

require('angular'); 
require('angular-mocks'); 

//Main module needs these 
jQuery = require('jquery'); 
require('angular-bootstrap'); 
require('angular-recaptcha'); 
require('angular-ui-router'); 
require('ngstorage'); 
require(**The path to the main module**); 
require(**The path to a service it uses**); 
require(**The path to a service it uses**); 
require(**The path to a service it uses**); 

describe('Blah', function() { 
    beforeEach(angular.mock.module('myApp')); 

    var $controller; 

    beforeEach(angular.mock.inject(function(_$controller_) { 
    $controller = _$controller_; 
    })); 

    describe('blahblah', function() { 
    it('sets loading to true', function() { 
     var $scope = {}; 
     var controller = $controller('controller', {$scope: $scope}); 
     assert($scope.showLoading === true); 
    }); 
    }); 
}); 

Основной модуль:

(function() { 
    'use strict'; 
})(); 


// Jquery noconflict 
jQuery.noConflict(); 

var myApp = angular.module('myApp', ['ui.router', 'ngStorage', 'vcRecaptcha', 'ui.bootstrap']); 

myApp.config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function($stateProvider, $urlRouterProvider, $locationProvider) { 
    ... 
}]) 
.run([blah bunch of dependencies]) { 
    ... 
}]); 

Контроллер (отдельный тьфу):

'use strict'; 

myApp.controller('controller', ['$scope', '$http', '$localStorage', 'service1', 'service2', 'service3', 
    function ($scope, $http, $localStorage, service1, service2, service3) { 
    .. 
    } 
... 

Как вы можете видеть, что я в аду зависимости. Я получил пример теста на угловом сайте для работы, основная проблема заключается в том, что зависимости и myApp не видны контроллеру. "ReferenceError: Не удалось найти переменную: myApp" в контроллерах/услугах

Если у кого-то есть лучший способ пройти тестирование, я все уши.

+0

не обязательно лучший способ тестирования столько, сколько у меня есть предложение. Angularjs не предназначено для написания с кучей контроллеров, по сути, в Angular2, они полностью отключили контроллеры, потому что люди пропустили их. Я предлагаю оглянуться на документы и подумать о том, чтобы перейти на более директивный центральный маршрут. Недавно моя компания переключилась с контроллеров на заводы и директивы и заметила значительное улучшение. – Ohjay44

+0

Спасибо за комментарий. Я всего лишь стажер, поэтому я просто должен проверить код, который я не писал, поэтому я не могу делать никаких переключений и т. Д. Надеюсь, ответ «estus» исправляет его. –

ответ

2

Речь идет не о зависимости, а не о тестировании.

Этот код, похоже, полагается на глобальную переменную myApp, это строго противоположно тому, для чего предназначены угловые модули.

myApp должен быть локальной переменной, которая определяется динамически в каждой области видимости функции

(function() { 

var myApp = angular.module('myApp', [...]); 
... 

})(); 

(function() { 

var myApp = angular.module('myApp'); 
myApp.controller('controller', ...) 
... 

})(); 
+0

не было бы также правильным, если бы у вас все еще мог быть ваш контроллер в другом файле js, если бы у вас было 10 контроллеров и вы хотели его немного почистить. Вы просто ссылаетесь на свой модуль через угловой, а не через глобальную переменную, как вы сказали выше. Пример: angular.module ('myApp'). Controller (.......) – Ohjay44

+0

Просьба проигнорировать этот комментарий –

+0

@ Ohjay44 Конечно, это вопрос предпочтения. Он может быть избыточным для определения одного контроллера, но может быть полезен для согласованности стиля. – estus

Смежные вопросы