2013-08-22 30 views
5

Trong khi chạy grunt test trên ứng dụng Angular (1.0.7) scaffolded Angular (1.0.7), tôi nhận được lỗi sau:

TypeError: 'undefined' is not a function (evaluating '$scope.$parent.userLoggedIn(true)') 

userLoggedIn() nằm trong bộ điều khiển chính index.js. Các chức năng chính nó chạy tốt trong ứng dụng góc.

Lỗi này không xảy ra trên các biến số boolean hoặc chuỗi khác trong bộ điều khiển của tôi $scope.$parent boolean hoặc chuỗi khác, vì vậy nó liên quan trực tiếp đến các chức năng gọi trong một phụ huynh.

Tôi đang nghĩ rằng mình đang sử dụng $scope.$parent cách sai hoặc cần phải xác định bộ điều khiển index.js của mình trong thử nghiệm, nhưng tài liệu kiểm tra Karma không thường xuyên, do đó rất khó để biết.

EDIT: Đây là bộ điều khiển:

'use strict'; 

angular.module('uiApp') 
    .controller('LookupCtrl', ['$scope', function ($scope) { 
    $scope.awesomeThings = [ 
     'HTML5 Boilerplate', 
     'AngularJS', 
     'Karma' 
    ]; 

    $scope.$parent.userLoggedIn(true); 

    }]); 

Dưới đây là bài kiểm tra:.

'use strict'; 

describe('Controller: LookupCtrl', function() { 

    // load the controller's module 
    beforeEach(module('uiApp')); 

    var LookupCtrl, 
    scope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    LookupCtrl = $controller('LookupCtrl', { 
     $scope: scope 
    }); 
    })); 

    it('should attach a list of awesomeThings to the scope', function() { 
    expect(scope.awesomeThings.length).toBe(3); 
    }); 

}); 

(Vâng, tôi biết tôi chỉ sử dụng các bài kiểm tra mặc định awesomeThings cho bây giờ tôi mới để kiểm tra góc).

+0

Bạn có thể vui lòng cung cấp mã của mình cho bộ điều khiển thử nghiệm không. – BKM

+0

Nói chung, điều đó có nghĩa là bạn đang cố sử dụng tên thuộc tính để tìm một hàm, nhưng đối tượng mà bạn đang làm việc không có thuộc tính như vậy. Vì vậy, bạn đang cố gắng sử dụng 'undefined' như một hàm, và nó không phải là một hàm. – Pointy

Trả lời

1

Bạn đang cấp cho bộ điều khiển rootScope, không có $parent (đó là gốc). Thay đổi mã bộ điều khiển của bạn để gọi nó chính xác (sử dụng chuỗi nguyên mẫu) và bạn sẽ ổn khi chỉ cần chuyển {my: props} làm đối tượng.

+0

Tôi đã nhận được nó để làm việc, nhưng tôi không chắc chắn tôi đã làm nó đúng cách. Tôi đã thêm IndexCtrl của mình trước LookupCtrl trong thử nghiệm và được gọi là phạm vi gốc trong đó. – Sartaj

+0

Tôi đã thêm 'IndexCtrl' trước' LookupCtrl' trong thử nghiệm và được gọi là 'var scope = $ rootScope. $ New()' với '$ scope: scope. $ New()' trong đó. Sau đó, trong 'LookupCtrl', tôi vừa tạo một phạm vi mới với' $ scope: scope. $ New() ' – Sartaj

+8

@HomoSapien - bạn có thể đăng mã bằng giải pháp cập nhật của mình không? – Shamoon

Các vấn đề liên quan