2016-10-14 5 views
0

각 컨트롤러가 자신의 모듈 즉, 응용 프로그램 모듈의 컨트롤러가 아닌 다음 주 응용 프로그램의 종속성으로로드 된 내 응용 프로그램을 테스트하려고합니다. 기준 치수.각/재스민 테스트 컨트롤러 모듈 각도 각도

'Expected undefined to be defined.'

편집

I 업데이트 login.controller.spec : 난 그냥 loginController가 카르마/재스민, 나는 다음과 같은 출력을 얻을 사용하여 정의되어 있는지 확인하는 테스트를 실행하려고 할 때 갈마 브라우저를 chrome으로 바꿨다. 그래서 나에게 더 유용한 디버그 정보를 주었다. authFactory < - - $ HTTP < - $ translateStaticFilesLoader < - $

번역 authFactoryProvider < :

알 수없는 공급자가 : 지금은 주요 응용 프로그램 파일에 $ httpProvider.interceptors에 추가 공장 관련 오류를 받고 있어요

DEBUG [웹 서버] : 제공 (캐시)를

나는 카르마가 실행될 때로드되고있는, 각-번역 - 로더 - 정전기 files.js를 포함하여 해결이되었습니다이 관련된 유사한 문제를 발견 : /path/to/my/app/bower_components/angular-translate-loader-static-files/angular-translate-loader-static-files.js

카르마와 관련된 모든 종속성 문제를 어떻게 해결합니까?

하는 index.js

'use strict'; 

angular.module('app', 
    [ 
    //'mockBackend', //uncomment when loading mock backend 
    'ngAnimate', 
    'ngCookies', 
    'ngTouch', 
    'ngSanitize', 
    'ngResource', 
    'ui.bootstrap', 
    'ui.router', 
    'ui.router.stateHelper', 
    'pascalprecht.translate', 
    'utilsModule', 
    'loginModule', 
    'vsmsPackageModule', 
    'vsmsCampaignModule', 
    'vdmsCampaignModule', 
    'vdmsDashboardModule', 
    'daterangepicker', 
    'ui.event', 
    'idmAdminModule', 
    'helpdeskModule', 
    'ncy-angular-breadcrumb', 
    'rzModule', 
    'vsmsDashboardModule', 
    'highcharts-ng', 
    'permission', 
    'dndLists' 
    ]) 
    .config(function ($stateProvider, $urlRouterProvider, $httpProvider, $locationProvider, $translateProvider, $breadcrumbProvider, $compileProvider) { 
    $urlRouterProvider.otherwise('/'); 
    //initialize get if not there 
    if (!$httpProvider.defaults.headers.get) { 
     $httpProvider.defaults.headers.get = {}; 
    } 
    //disable IE ajax request caching 
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT'; 
    // extra 
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; 
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache'; 

    $locationProvider.html5Mode({ 
     enabled: false, 
     requireBase: false 
    }); 
    $translateProvider.useSanitizeValueStrategy('sanitize'); 
    $translateProvider.useStaticFilesLoader({ 
     prefix: '/locales/', 
     suffix: '.json' 
    }); 

    $translateProvider 
    .preferredLanguage('en_us') 
    .fallbackLanguage('en_us'); 

    $breadcrumbProvider.setOptions({ 
     templateUrl: 'components/templates/breadcrumb.tpl.html' 
    }); 
    $compileProvider.debugInfoEnabled(false); 
    // $compileProvider.aHrefSanitizationWhitelist(/^\s*(|blob|):/); 
    $httpProvider.interceptors.push('authFactory'); 
     $httpProvider.interceptors.push('headersFactory'); 
    }) 

login.module.js

angular.module('loginModule', []); 

login.controller.js

angular.module('loginModule') 
    .controller('loginController', login); 

    login.$inject = [ 
     '$log', 
     '$uibModal', 
     '$rootScope', 
     'storageFactory', 
     'loginFactory', 
     '$state', 
     'RoleStore', 
     'PermissionStore' 
    ]; 

    function login($log, $uibModal, $rootScope, storageFactory, loginFactory, $state, RoleStore, PermissionStore) { 

     /* jshint validthis: true */ 
     var vm = this; 
     vm.loginUser = loginUser; 
     vm.forgotPassword = forgotPassword; 
     vm.errorCode = null; 
     PermissionStore.clearStore(); 

     function loginUser() { 
     ... 

내가 J 해요 UST는 컨트롤러가 존재하는지 테스트하기 위해 노력하고 나는 오류 번번이 할 수

Expected undefined to be defined.

login.controller.spec.js

describe('loginController', function() { 

    beforeEach(module('app')); 

    var $controller, 
    $scope, 
    $log, 
    $uibModal, 
    $rootScope, 
    storageFactory, 
    loginFactory, 
    $state, 
    RoleStore, 
    PermissionStore, 
    vsmsCoreFactory; 

    beforeEach(inject(function(_$controller_, _$log_, _$uibModal_, _$rootScope_, _storageFactory_, _loginFactory_, _$state_, _RoleStore_, _PermissionStore_, _vsmsCoreFactory_){ 
    $controller = _$controller_; 
    $scope = $rootScope.new(); 
    $log = _$log_; 
    $uibModal = _$uibModal_; 
    $rootScope = _$rootScope_; 
    storageFactory = _storageFactory_; 
    loginFactory = _loginFactory_; 
    $state = _$state_; 
    RoleStore = _RoleStore_; 
    PermissionStore = _PermissionStore_; 
    vsmsCoreFactory = _vsmsCoreFactory_; 
    })); 

    describe('vm.loginUser', function() { 
    it('should be defined', function() { 
     var loginController = $controller('loginController', { 
     $log: $log, 
     $uibModal: $uibModal, 
     $rootScope: $rootScope, 
     storageFactory: storageFactory, 
     loginFactory: loginFactory, 
     $state: $state, 
     RoleStore: RoleStore, 
     PermissionStore: PermissionStore, 
     vsmsCoreFactory: vsmsCoreFactory 
     }); 
     expect(loginController).toBeDefined(); 
     // expect(testController.model.name).toEqual("controllerAs vm test"); 
    }); 
    }); 

}); 

단위 tests.js

'use strict'; 

var gulp = require('gulp'); 

var $ = require('gulp-load-plugins')(); 

var wiredep = require('wiredep'); 

var paths = gulp.paths; 

function runTests (singleRun, done) { 
    var bowerDeps = wiredep({ 
    directory: 'bower_components', 
    exclude: ['bootstrap-sass-official'], 
    dependencies: true, 
    devDependencies: true 
    }); 

    var testFiles = bowerDeps.js.concat([ 
    './src/app/index.js', 
    './src/components/scripts/ui-bootstrap-custom-tpls-2.1.3.js', 
    './src/{app,components}/**/*.module.js', 
    './src/{app,components}/**/*.factory.js', 
    './src/{app,components}/**/*.controller.js', 
    './src/{app,components}/**/*.spec.js' 
    ]); 

    gulp.src(testFiles) 
    .pipe($.karma({ 
     configFile: 'karma.conf.js', 
     action: (singleRun)? 'run': 'watch' 
    })) 
    .on('error', function (err) { 
     // Make sure failed tests cause gulp to exit non-zero 
     throw err; 
    }); 
} 

gulp.task('test', function (done) { runTests(true /* singleRun */, done) }); 
gulp.task('test:auto', function (done) { runTests(false /* singleRun */, done) }); 

답변

0

이미 답변 된 내용을 참조하십시오.

How to inject controller dependencies in Jasmine tests?

인 LoginController 의존성은 단위 테스트에 전달되지 않습니다.

$ controller의 두 번째 매개 변수는 컨트롤러 종속성을위한 것입니다.

빈 종속성이 전달됩니다.

$ controller ('loginController', {});

loginColtroller를 테스트하기 전에 모든 종속 모듈이로드되었는지 확인하십시오.

귀하의 코드가 수정되었습니다. 나는 그것이 효과가 있기를 바랍니다.

'use strict'; 

describe('loginController', function() { 

    beforeEach(module('loginModule')); 

    var loginController; 

    beforeEach(inject(function($controller, _$log_, _$uibModal_, _$rootScope_, _storageFactory_, _loginFactory_, _$state_, _RoleStore_, _PermissionStore_){ 
    scope = _$rootScope_.$new(); 
    loginController = $controller('loginController', 
    { // all dependencies has to be passed in order 
     '$log' : _$log_, 
     '$uibModal' : _$uibModal_, 
     '$rootScope' : _$rootScope_, 
     'storageFactory' : _storageFactory_, 
     'loginFactory': _loginFactory_, 
     '$state': _$state_, 
     'RoleStore': _RoleStore_, 
     'PermissionStore': _PermissionStore_ 
    }, 
    {}); 
    })); 

    it('should be defined', function() { 
    expect(loginController).toBeDefined(); 
    }); 

}); 
+0

감사하지만 문제가 해결되지 않았습니다. 이제 나는 그 시험이 실패했음을 알았지 만 이유는 없다. – neridaj

+0

플 런커를 만들 수 있습니까? –

+0

시도 beforeEach (module ('app')); beforeEach (module ('loginModule')) 대신; –

0

문제는 login.module.js 파일입니다.

loginModule을 정의하는 동안 ui.bootstrapui.router을 종속 항목으로 주입해야합니다. 그렇지 않으면 loginController을 정의하는 동안 $uibModal$state을 얻을 수 없습니다.

loginModule

angular.module('loginModule', ['ui.bootstrap', 'ui.router']); 

PS의 정의되어야한다 : 나는 storageFactory, loginFactory, RoleStorePermissionStoreloginModule 자체에 정의되어 있는지 여기에 있으리라 믿고있어.

희망이 도움이됩니다.

+0

이러한 종속성은 index.js 파일에 삽입됩니다. 나는 그들을 login.module.js 파일에 추가하려고 시도했지만 stil은 같은 오류를 얻는다. – neridaj