Работа с зависимостями в angularjs Testing

0

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

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

Для фактического приложения он загружается с беседкой, что раздражает, так как я тестирую с помощью 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]) {
   ...
}]);

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

'use strict';

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

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

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

  • 0
    У меня не обязательно есть лучший способ проверить это так, как у меня есть предложение. Angularjs не предназначен для написания с несколькими контроллерами, фактически в Angular2 они покончили с контроллерами полностью, потому что люди скучали по их использованию. Я предлагаю оглянуться назад на документы и рассмотреть возможность выбора более директивного центрального маршрута. Моя компания недавно перешла от контроллеров к фабрикам и директивам и заметила значительное улучшение.
  • 0
    Спасибо за комментарий. Я всего лишь стажер, поэтому я должен был протестировать кодовую базу, которую не написал, поэтому не могу переключаться и т.д. Надеюсь, ответ estus это исправит.
Теги:
browserify
karma-mocha

1 ответ

2
Лучший ответ

Речь идет не об аддикции, а о тестировании.

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

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

(function () {

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

})();

(function () {

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

})();
  • 0
    Не было бы также правильно, что ваш контроллер все еще может быть в другом файле js, скажем, если у вас есть 10 контроллеров и вы хотите немного его почистить. Вы бы просто ссылались на ваш модуль через angular, а не через глобальную переменную, как вы сказали выше. Пример: angular.module ('myApp'). Controller (.......)
  • 0
    Пожалуйста, игнорируйте этот комментарий
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню