簡體   English   中英

如何使用Karma和Jasmine在AngularJs測試的$ scope或$ window中模擬對象?

[英]How to mock objects inside $scope or $window in AngularJs tests using Karma and Jasmine?

我剛開始使用Karma和Jasmine測試AngularJs控制器。

我正在嘗試測試此控制器:

angular.module('app.dashboard.admin', [])
    .controller('AdminCtrl', function (locale, $log, $scope, $window, $state) {

        $scope.translation = $window.translation()[locale];
        $scope.showAdminBoard = false;
        $scope.initModel = {
            disableProgress: false,
            message: $scope.translation['admin_platform_init'],
            error: ''
        };

        $scope.adminPrivileges = {};

        $scope.onGetAdminPrivileges = function () {
            return $scope.adinPrivileges;
        }

這是我的測試代碼:

'use strict';

describe('dashboard.admin module', function () {
    beforeEach(function(){
        module('app.dashboard.admin');
    });

    var auth, scope, ctrl, window;

    beforeEach(inject(function ($controller, $rootScope, $window) {
        auth = Auth;
        scope = $rootScope.$new(); //get a childscope
        window = {
            translation: $window.translation
        };

        ctrl = $controller("AdminCtrl", {$scope: scope, $window: window});
    }));

    describe('Admin Controller', function () {
        it('should inject controller', function () {
            expect(ctrl).toBeDefined();
        });
    });
});

但是,當我嘗試執行此測試代碼時,出現以下錯誤:

TypeError: undefined is not an object (evaluating '$scope.translation['admin_platform_init']') (line 11)
        views/dashboard.admin/admin.js:11:40
        [native code]
        instantiate@bower_components/angular/angular.js:4786:61
        $controller@bower_components/angular/angular.js:10607:39
        bower_components/angular-mocks/angular-mocks.js:2249:23
        views/dashboard.admin/admin.spec.js:113:27
        invoke@bower_components/angular/angular.js:4771:24
        WorkFn@bower_components/angular-mocks/angular-mocks.js:3130:26
        loaded@http://localhost:9876/context.js:151:17
        inject@bower_components/angular-mocks/angular-mocks.js:3097:28
        views/dashboard.admin/admin.spec.js:106:22
        global code@views/dashboard.admin/admin.spec.js:3:9
        Expected undefined to be defined.
        views/dashboard.admin/admin.spec.js:118:37
        loaded@http://localhost:9876/context.js:151:17

我試圖模擬$window對象並覆蓋angular的$ window對象,但是我沒有成功。

我已經檢查了我的karma.conf.js文件中的依賴項,它們都在那里。

我還檢查了以下問題:

業力茉莉花:如何測試$ translate.use?

茉莉花模擬窗口對象

但是建議的解決方案並沒有真正幫助。

因此,我試圖找到一種方法來模擬$scope.translation['admin_platform_init']對象,以便能夠執行我的測試。

有人可以指出正確的方向嗎?

謝謝。

試試這個而不是$ window.translation

window = {
    translation: function () {
        return {
            "admin_platform_init": "This is test message"
        };
    }
};

我設法通過導入“ app”模塊解決了我的問題。

修復后的測試代碼如下:

'use strict';

describe('dashboard.admin module', function () {
    beforeEach(function(){
        module('app');
        module('app.dashboard.admin');
    });

    var auth, scope, ctrl, window;

    beforeEach(inject(function ($controller, $rootScope, $window) {
        auth = Auth;
        scope = $rootScope.$new(); //get a childscope
        window = {
            translation: $window.translation
        };

        ctrl = $controller("AdminCtrl", {$scope: scope, $window: window});
    }));

    describe('Admin Controller', function () {
        it('should inject controller', function () {
            expect(ctrl).toBeDefined();
        });
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM