2016-10-14 4 views
0

自分のアプリケーションをテストしようとしています。各コントローラは自分のモジュールに定義されています。つまり、アプリケーションモジュールのコントローラとしてではなく、メインアプリケーションの依存関係としてロードされています。モジュール。私はちょうどloginControllerはカルマ/ジャスミンを使用して、定義されていることを確認し、テストを実行しようとすると、私は次のような出力を得る:カルマ/ジャスミンテストコントローラモジュールの角度

'Expected undefined to be defined.'

編集

を私はlogin.controller.specを更新カルマブラウザをchromeに切り替えると、より有用なデバッグ情報が得られました。 authFactory < - - $ HTTP < - $ translateStaticFilesLoader < - $

を翻訳authFactoryProvider <:

不明プロバイダ:今、私は、メインのアプリケーションファイル内の$ httpProvider.interceptorsに追加された工場に関連するエラーを取得しています

DEBUG [Webサーバ]:サービング(キャッシュ)を

私はカルマの実行時にロードされている、角度-翻訳・ローダーの静的-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の2番目のパラメータはコントローラの依存関係です。

空の依存関係が渡されます。

$ 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

try beforeEach(module( 'app')); beforeEach(module( 'loginModule'))の代わりに。 –

0

問題は、あなたのlogin.module.jsファイルです。

loginModuleを定義するときは、ui.bootstrapui.routerを依存関係として注入する必要があります。そうでなければloginControllerを定義している間は$uibModal$stateを得ることができません。

これはPSあなたloginModule

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

の定義する必要があります:私はstorageFactoryloginFactoryRoleStorePermissionStoreloginModule自体に定義されていることを、ここで想定しています。

希望すると便利です。

+0

これらの依存関係は、index.jsファイルに挿入されます。私はそれらをlogin.module.jsファイルに追加することを止めましたが、stilは同じエラーを受け取ります。 – neridaj