类型错误:$范围是未定义的角度控制单元测试与茉莉花 [英] TypeError: $scope is undefined in Angular controller unit test with Jasmine

查看:143
本文介绍了类型错误:$范围是未定义的角度控制单元测试与茉莉花的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个的非常的简单,非常回吐向下测试和控制器。我控制器LedgerCtl'有一个注入的服务LedgerService我在其他地方进行测试,所以在我LedgerControllerSpec我创建的代表,在嘲笑的服务功能。当我执行测试时,我得到'范围未定义的错误。 并的这是我找到最接近的答案;然而,既不解决我的问题。

  angular.module(TeamSportApp,[])
.controller('LedgerCtl',函数($范围,LedgerService){
    $ scope.ledger = [];
    //初始化通过获取图片列表控制器
    $ scope.getLedger =功能(){
        $ scope.ledger = LedgerService.getLedger();
    };
    //初始化列表
    $ scope.getLedger();
})

和规范

  VAR ledgerStaticData = [
{ID:1,名称:项目1,余额:2100},
{ID:2,姓名:项目2,余额:3300},
{ID:3,名:项目3,余额:2000},
{ID:4,名称:ITEM4,余额:1500}
];描述(控制器,函数(){
VAR CTRL,mockLedgerService,$范围;beforeEach(模块('TestApp',[]));
beforeEach(注(函数($ rootScope,$控制器){    mockLedgerService = {
        getLedger:功能(){}
    };    spyOn(mockLedgerService,'getLedger')andReturn(ledgerStaticData)。
    $范围= $ rootScope $新的()。
    CTRL = $控制器('LedgerCtl',{$范围:$范围,LedgerService:mockLedgerService});
}));它('应该叫mockLedgerService getLedger',函数(){
    期待($ scope.ledger.length).toBe(4); <<< --- SCOPE未定义HERE
});
});


解决方案

您测试不加载其中控制器被定义模块( TeamSportApp )。添加以下行:

  beforeEach(模块('TeamSportApp'));

另外,定义以下空模块是多余的:

  beforeEach(模块(TestApp,[]));

This is a very simple, quite pared down test and controller. My controller 'LedgerCtl' has an injected service 'LedgerService' that I test elsewhere, so in my LedgerControllerSpec I created a function that stands-in for the mocked service. When I execute the test, I get the 'scope undefined' error. this and this are the closest answers I found; however neither solve my issue.

angular.module("TeamSportApp", [])
.controller('LedgerCtl', function($scope, LedgerService) {
    $scope.ledger = [];
    // init controller by getting list of pics
    $scope.getLedger = function() {
        $scope.ledger = LedgerService.getLedger();
    };
    // init list
    $scope.getLedger();
})

and the spec

var ledgerStaticData = [
{ "ID": 1, "Name": "Item1", Balance: 2100 },
{ "ID": 2, "Name": "Item2", Balance: 3300 },
{ "ID": 3, "Name": "Item3", Balance: 2000 },
{ "ID": 4, "Name": "Item4", Balance: 1500 }
];



describe('controllers', function(){
var ctrl, mockLedgerService, $scope;

beforeEach(module('TestApp',[]));
beforeEach(inject(function($rootScope, $controller) {

    mockLedgerService = {
        getLedger: function() {}
    };

    spyOn(mockLedgerService, 'getLedger').andReturn(ledgerStaticData);
    $scope = $rootScope.$new();
    ctrl = $controller('LedgerCtl', {$scope: $scope , LedgerService: mockLedgerService });
}));

it('Should call mockLedgerService getLedger', function() {
    expect($scope.ledger.length).toBe(4);   <<<--- SCOPE UNDEFINED HERE
});
});

解决方案

Your test doesn't load the module where the controller is defined (TeamSportApp). Add the following line:

beforeEach(module('TeamSportApp'));

Also, defining the following empty module is unnecessary:

beforeEach(module('TestApp',[]));

这篇关于类型错误:$范围是未定义的角度控制单元测试与茉莉花的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆