18

Chúng ta có vài phương pháp trong Bộ điều khiển góc, không nằm trong biến phạm vi.Làm thế nào chúng ta có thể kiểm tra các phương pháp điều khiển góc không phạm vi?

Có ai biết, làm thế nào chúng ta có thể thực hiện hoặc gọi những phương pháp đó trong các bài kiểm tra Jasmine?

Đây là mã chính.

var testController = TestModule.controller('testController', function($scope, testService) 
{ 

function handleSuccessOfAPI(data) { 
    if (angular.isObject(data)) 
    { 
     $scope.testData = data; 
    } 
} 

function handleFailureOfAPI(status) { 
    console.log("handleFailureOfAPIexecuted :: status :: "+status); 
} 

// this is controller initialize function. 
function init() { 
    $scope.testData = null; 

    // partial URL 
    $scope.strPartialTestURL = "partials/testView.html; 

    // send test http request 
    testService.getTestDataFromServer('testURI', handleSuccessOfAPI, handleFailureOfAPI); 
} 

init(); 
} 

Bây giờ trong thử nghiệm hoa nhài của tôi, chúng tôi đang đi "handleSuccessOfAPI" và phương pháp "handleFailureOfAPI", nhưng đây là những không xác định.

Đây là mã thử nghiệm hoa nhài.

describe('Unit Test :: Test Controller', function() { 
var scope; 
var testController; 

var httpBackend; 
var testService; 


beforeEach(function() { 
    module('test-angular-angular'); 

    inject(function($httpBackend, _testService_, $controller, $rootScope) { 

     httpBackend = $httpBackend; 
     testService= _testService_; 

     scope = $rootScope.$new(); 
     testController= $controller('testController', { $scope: scope, testService: testService}); 
      }); 
}); 

afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest(); 
    }); 

it('Test controller data', function(){ 
    var URL = 'test server url'; 

    // set up some data for the http call to return and test later. 
    var returnData = { excited: true }; 

    // create expectation 
    httpBackend.expectGET(URL).respond(200, returnData); 

    // make the call. 
    testService.getTestDataFromServer(URL , handleSuccessOfAPI, handleFailureOfAPI); 

    $scope.$apply(function() { 
     $scope.runTest(); 
    }); 

    // flush the backend to "execute" the request to do the expectedGET assertion. 
    httpBackend.flush(); 

    // check the result. 
    // (after Angular 1.2.5: be sure to use `toEqual` and not `toBe` 
    // as the object will be a copy and not the same instance.) 
    expect(scope.testData).not.toBe(null); 
}); 
}); 

Trả lời

8

Vì bạn sẽ không có quyền truy cập vào các chức năng đó. Khi bạn xác định hàm JS được đặt tên, nó giống như khi bạn nói

var handleSuccessOfAPI = function(){}; 

Trong trường hợp này, rõ ràng là var chỉ nằm trong phạm vi trong khối và không có tham chiếu ngoài cho nó từ bộ điều khiển gói.

Bất kỳ chức năng nào có thể được gọi một cách kín đáo (và do đó được kiểm tra) sẽ có sẵn trên phạm vi $ của bộ điều khiển.

+2

Đúng. Hơn nữa, chúng ta không nên thử nghiệm các chức năng riêng. Nói chung, 'init()' là đơn vị được thử nghiệm với dữ liệu giả định sẽ đảm bảo 'handleSuccessOfAPI' hoặc' handleFailureOfAPI' được gọi. Các đối tượng/dữ liệu được giả lập sẽ điều khiển đường dẫn thực thi. – dmahapatro

+0

Tôi thấy phạm vi $ làm cho hàm/biến công khai (khi so sánh nó với một cái gì đó như Java). Tôi không quá quen thuộc với thử nghiệm đơn vị trong Java, nhưng có phải "không thử nghiệm các chức năng riêng tư" mà bạn thường làm trong Java không? – Chris

+0

Chris, tôi cũng có kinh nghiệm viết bài kiểm tra giới hạn nói chung, đã viết một số bài kiểm tra JUnit nhưng tôi không có nghĩa là một chuyên gia trong thử nghiệm hay bất cứ điều gì. Tôi tưởng tượng vì các hàm riêng không được hiển thị khi bạn khởi tạo một thể hiện của một đối tượng mà bạn vẫn còn đang bị ràng buộc tương tự mà bạn chỉ có thể kiểm tra những thứ có thể truy cập công khai. Tôi nghĩ cuối cùng điều này có ý nghĩa vì bạn thực sự quan tâm đến một đoạn mã hoàn thành một nhiệm vụ theo kiểu hộp đen khi bạn viết một bài kiểm tra, đó là nếu tôi cung cấp x tôi mong đợi y, nhưng các chi tiết thực hiện không một mối quan tâm. – shaunhusain

9

Tôi biết đây là trường hợp cũ nhưng đây là giải pháp tôi đang sử dụng.

Sử dụng 'này' của điều khiển của bạn

.controller('newController',['$scope',function($scope){ 
    var $this = this; 
    $this.testMe = function(val){ 
     $scope.myVal = parseInt(val)+1; 
    } 
}]); 

Đây là thử nghiệm:

describe('newDir', function(){ 
var svc, 
    $rootScope, 
    $scope, 
    $controller, 
    ctrl; 


beforeEach(function() { 
    module('myMod'); 
}); 

beforeEach(function() { 
    inject(function (_$controller_,_$rootScope_) { 

     $controller = _$controller_; 
     $rootScope = _$rootScope_; 
     $compile = _$compile_; 
     $scope = $rootScope.$new(); 
     ctrl = $controller('newController', {'$rootScope': $rootScope, '$scope': $scope }); 
    }); 
}); 

it('testMe inc number', function() { 

    ctrl.testMe(10) 
    expect($scope.myVal).toEqual(11); 
}); 

});

Full Code Example

+0

Có lý do nào bạn sử dụng '$ this' hay chỉ vì bạn không thích sử dụng các biến như' self'? – svassr

+0

Bạn có hỏi tại sao tôi đặt tên biến "$ this" thay vì đặt tên là "self" không? Không có lý do gì cho sự lựa chọn của tôi trong các tên biến. "Tự" có thể làm cho mã dễ đọc hơn. – tmc

+0

Vâng đó là câu hỏi thực sự Cảm ơn – svassr

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