2013-10-09 13 views
13

Tôi có một điều khiển mà được một giá trị từ $scope và gửi nó đến một trạng thái khác nhau:thử nghiệm angularjs ui-router go() phương pháp

controllers.controller('SearchController', ['$scope', '$state', '$stateParams', 
function($scope, $state, $stateParams) { 
    $scope.search = function() { 
     $stateParams.query = $scope.keyword; 
     $state.go('search', $stateParams); 
    }; 
}]); 

Tôi không chắc chắn làm thế nào để đi về đơn vị thử nghiệm phương pháp tìm kiếm này. Làm thế nào tôi có thể xác minh rằng phương pháp go đã được gọi hoặc làm một số loại when($state.go('search', $stateParams)).then(called = true); với Karma/AngularJS?

Trả lời

31

Cả hai âm thanh này giống như những thứ bạn có thể làm với gián điệp Jasmine.

describe('my unit tests', function() { 
    beforeEach(inject(function($state) { 
     spyOn($state, 'go'); 
     // or 
     spyOn($state, 'go').andCallFake(function(state, params) { 
      // This replaces the 'go' functionality for the duration of your test 
     }); 
    })); 

    it('should test something', inject(function($state){ 
     // Call something that eventually hits $state.go 
     expect($state.go).toHaveBeenCalled(); 
     expect($state.go).toHaveBeenCalledWith(expectedState, expectedParams); 
     // ... 
    })); 
}); 

Có một bảng tính gián điệp tốt ở đây http://tobyho.com/2011/12/15/jasmine-spy-cheatsheet/ hoặc tài liệu Jasmine thực tế here.

Điều tốt đẹp về việc sử dụng gián điệp là nó sẽ cho phép bạn tránh thực sự thực hiện quá trình chuyển đổi trạng thái trừ khi bạn nói rõ ràng. Một quá trình chuyển đổi trạng thái sẽ không kiểm tra đơn vị của bạn trong Karma nếu nó thay đổi URL.

+0

Hoàn hảo, chỉ là những gì tôi đang tìm kiếm. – shmish111

+8

Với Jasmine 2.x, thay thế hàm gọi '.andCallFake' bằng' .and.callFake'. – satJ

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