2

コントローラーをテストしようとしていますが、エラーが発生します

TypeError: Object # has no method 'apply' ReferenceError: inject is not defined

unit-test.js は

define(['angular',
        'myApp',
        'angularMocks',
        'MyCtrl'
], function() {

describe('Testing controller', function() {
        var $scope = null;
        var ctrl = null;

        beforeEach(angular.module('myApp'));

        beforeEach(inject(function ($injector) {
            $scope = $injector.get('$rootScope');
            $controller = $injector.get('$controller');
        }));


     describe('MyCtrl', function () {
        it('should call test variable', function () {
                $scope = $rootScope.$new();

                ctrl = $controller('MyCtrl', {
                    $scope: $scope
                });

                expect($scope.test).toBe("sth");
            });
        });

    });
});

MyCtrl で宣言しました$scope.test = "sth";

私が変わるとき

beforeEach(angular.module('myApp'));beforeEach(module('myApp'));

私は得ていますReferenceError: module is not defined

Karma バージョン: 0.9.8 および AngularJS v1.0.8 を使用します。

どうもありがとうございました!

4

1 に答える 1

8

requirejs を使用している場合は、やるべきことがたくさんあります。

まず、karma-requirejsプラグインをpackage.json

"karma-requirejs": "~0.1.0",

次に、構成ファイルを変更する必要があります。一部を追加requirejsするframeworks必要があります 次に、必要なものを除外しますmain.js

pattern次に、構成ではなく構成を介しincludeてすべてのライブラリファイルを追加します

必要なものを追加する必要がありますmain-test.js(下部にあるテスト記述用の構成ファイル)

module.exports = function (config) {
    config.set({ 
        basePath: '',

        frameworks: ['jasmine', 'requirejs'],

        files: [
            {pattern: 'app/bower_components/jquery/jquery.min.js', included: false},

            {pattern: 'app/bower_components/angular/angular.min.js', included: false},
            {pattern: 'app/bower_components/angular-resource/angular-resource.min.js', included: false},
            {pattern: 'app/bower_components/angular-mocks/angular-mocks.js', included: false},
            {pattern: 'app/scripts/*.js', included: false},
            {pattern: 'app/scripts/**/*.js', included: false},
            {pattern: 'test/spec/**/*Spec.js', included: false},
            'test/main-test.js'
        ],

        exclude: ['app/scripts/main.js'],

        port: 8082,

        logLevel: config.LOG_DEBUG,

        autoWatch: false,

        browsers: ['Chrome'],

        singleRun: false
    });
};

を作成しますmain-test.js

では、依存関係として配置するすべてのテスト ファイルを取得する必要があります。

次に、古典的なrequirejs構成を実行し(カルマ定数baseUrlを使用/baseすることに注意してください)、最後に次のコードでカルマを開始します。window.__karma__.start();

例 :

var tests = [];
for (var file in window.__karma__.files) {
    if (window.__karma__.files.hasOwnProperty(file)) {
        if (/Spec\.js$/.test(file)) {
            tests.push(file);
        }
    }
}

require.config({

    // Karma serves files from '/base'
    baseUrl: '/base/app/scripts',

    paths: {
        jquery: '../bower_components/jquery/jquery.min',
        angular: '../bower_components/angular/angular.min',
        angularMocks: '../bower_components/angular-mocks/angular-mocks',
        ngResource: '../bower_components/angular-resource/angular-resource.min'
    },

    shim: {
        jquery: {
            exports: '$'
        },
        angular: {
            deps: [ 'jquery', 'bootstrap'],
            exports: 'angular'
        },
        ngResource: {
            deps: [ 'angular' ],
            exports: 'ngResource'
        },
        angularMocks: {
            deps: [ 'ngResource' ],
            exports: 'angularMocks'
        }
    },

    priority: [
        'angular'
    ],

    // ask Require.js to load these files (all our tests)
    deps: tests

});

require(tests, function(){
    window.__karma__.start();
});

テストファイルで:

beforeEach(angular.module('myApp'));に変更beforeEach(module('myApp'));

あなたの定義のパラメータをそのように変更してください:

define(['angular',
        'myApp',
        'angularMocks',
        'MyCtrl'
], function(angular, myApp, angularMocks, MyCtrl) 

コントローラーを挿入するには、それを行うだけです(MyCtrlrequire関数のパラメーターを配置する必要があります):

beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    $controller(MyCtrl, {
      $scope: scope
    });
  }));

そして最後に :

it('should call crudListMethods', function () {
    expect(scope.test).toBe("sth");
});

これでうまくいくはずです!それが役に立てば幸い !

于 2013-10-03T15:27:54.000 に答える