[Unit Testing] Angular Unit Testing, ui-router, httpbackend and spy
// backend test beforeEach(inject(function (_$compile_, _$httpBackend_, _$rootScope_, _$state_, _AnnouncementsService_, _CONFIG_) { compile = _$compile_; $httpBackend = _$httpBackend_; $scope = _$rootScope_.$new(); AnnouncementsService = _AnnouncementsService_; CONFIG = _CONFIG_; // Need to mock $state, so the ui-router resolve wont conflict with tests. state = _$state_; spyOn( state, 'go'); spyOn( state, 'transitionTo'); directiveElem = getCompiledElement(); directiveCtrl = directiveElem.controller('comAnnouncements'); })); afterEach(function() { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); it('should respond 200 to a http get request and get 1 announcement', function(){ AnnouncementsService.getAnnouncementData(2); let expectedResponse = [ { "id": 0, "title": "Maintenance work may affect Internet services 20/09/2015", "date": "11 Nov 2015 | 12:30 PM" } ]; $httpBackend.expectGET(CONFIG.BACKEND_API_URL + '/announcements/2').respond(200, { 'announcements': expectedResponse }); $httpBackend.flush(); expect(AnnouncementsService.announcementData).toEqual(expectedResponse); }); // ui-router test it('Should move to "home state"', () => { $scope.$apply(() => { angular.element(directiveElem.find('a')[0]).click(); $timeout.flush(); }); expect($state.current.name).toEqual('selfcare.home'); }); it('$state href should equal "/home"', () => { $scope.$apply(() => { $state.go('selfcare.home'); }); expect($state.current.name).toEqual('selfcare.home'); expect($state.href('selfcare.home')).toEqual('/home'); }); // Click to expect function to be called it('should call goToSearch()', function(){ spyOn(directiveCtrl, 'goToSearch'); angular.element(directiveElem.find('.header-icon-menu i')[0]).click(); expect(directiveCtrl.goToSearch).toHaveBeenCalled(); });