javascript - Jasmine/Angular.js $scope 在加载 Controller 上未定义

标签 javascript angularjs unit-testing jasmine

我正在尝试对我的代码启动单元测试。我遵循了互联网上的很多指南,但我无法开始构建我的 UT。

我想测试该代码:

"use strict";
var app = angular.module('address', []);

app.controller("AddressBookController", ["$rootScope", "$scope", "viewState",
    function($rootScope, $scope, viewState)
{   
    // PAGE DATA
    $scope.pageLimit = 7;
    $scope.pages = (viewState.state.pages) ? viewState.state.pages : [];
    $scope.currentPage = (viewState.state.currentPage) ? viewState.state.currentPage : 0;

    /* Other Code */
}

我的工厂代码是这个:

app.factory("viewState", [function(){
    return {
       state : {},
       data : {}
    };
 }])

因此,按照一些指南,我编写了测试代码:

describe('Address Book Controller Testing', function() {
    var $scope;
    var controller;
    var viewStateMock;

    beforeEach(function() {

        module('address');
        //mocking factories for test
        module(function($provide){
             $provide.factory('viewState', function() {
                    return {
                        prova: function() {
                            return {
                                state : {},
                                data : {}
                            };
                        }
                    };
                });
             });
          });

        beforeEach(inject(function ($rootScope, $controller, viewState) {
            $scope = $rootScope.$new();
            viewStateMock = viewState;
            spyOn(viewStateMock, 'prova').and.callThrough();
            controller = $controller('AddressBookController', { 
                $scope: $scope,
                viewState: viewStateMock
            });
        }));

        describe('All initialized', function (){

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

        });

    });
});

但是如果我每次启动测试都会出现此错误:

TypeError: Cannot read property 'pages' of undefined

我注意到执行该部分代码时会抛出错误:

controller = $controller('AddressBookController', { 
    $scope: $scope,
    viewState: viewStateMock
});

如果我在代码部分之前在控制台 $scope 上打印,我可以找到“pageLimit”属性。

我怎样才能继续我的测试?

谢谢大家的回答。

最佳答案

问题不在于您的 $scope 注入(inject),而在于提供 viewState

当您使用$provide.factory()时,您实际上是在构建一个工厂(并提供它)。所以语法应该与你的工厂相同:

module(function($provide) {
   $provide.factory('viewState', function() {
       return {
           state: {},
           data: {}
       };
   });
});

参见jsFiddle .

关于javascript - Jasmine/Angular.js $scope 在加载 Controller 上未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36160428/

相关文章:

javascript - AngularJS 路由,在显示 slug 时使用 ui-sref 传递 id 而不是 url 中的 id

javascript - 如何删除双括号中的字符串?

javascript - 父 View 上的 Angular UI 路由器动画

c# - 使用 AutoFixture/AutoMoq 为深度嵌套的类创建模拟?

javascript - ng-repeat 中的 Angular js 条件类

javascript - 如何将文本输入添加到 Samsung Smart TV 应用程序?

javascript - 这与 angular.js 中的 $scope 相比?

jquery - AngularJs 中的数据关闭后日期选择器不工作

python - Python 3.x 中的单元测试 'pathlib.Path.is_file'

python - 如何为 python tornado 应用程序编写单元测试?