【问题标题】:TypeError: $scope is undefined in Angular controller unit test with JasmineTypeError: $scope 在 Jasmine 的 Angular 控制器单元测试中未定义
【发布时间】:2014-04-03 22:08:49
【问题描述】:

这是一个非常简单、相当精简的测试和控制器。我的控制器“LedgerCtl”有一个注入服务“LedgerService”,我在其他地方进行了测试,因此在我的 LedgerControllerSpec 中,我创建了一个替代模拟服务的函数。当我执行测试时,我收到“范围未定义”错误。 this 和 this 是我找到的最接近的答案;但是都没有解决我的问题。

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();
})

和规格

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
});
});

【问题讨论】:

  • 看起来可能 mockLedgerService.getLedger() 正在返回正确的数据,但该数据未在 $scope 上设置?

标签: angularjs unit-testing controller jasmine


【解决方案1】:

您的测试未加载定义控制器的模块 (TeamSportApp)。添加以下行:

beforeEach(module('TeamSportApp'));

另外,不需要定义以下空模块:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 2015-10-12
    • 1970-01-01
    • 2014-05-17
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多