2016-02-06 89 views
0

我跟着這篇文章(http://gonehybrid.com/how-to-write-automated-tests-for-your-ionic-app-part-2/)創建了一個簡單的單元測試,使用Karma & Jasmine作爲Ionic控制器,但我一直在定義已定義的對象時出現未定義的錯誤。我錯過了明顯的東西?順便說一句,我能夠從上面的博客成功運行引用的測試,這讓我覺得我錯過了我的東西。努力開始AngularJS單元測試

錯誤a如下:

  1. 類型錯誤:未定義不是一個對象(評價 'authMock.login')在/Users/projects/app/tests/unit-tests/login.controller.tests。 js(line 65)
  2. TypeError:undefined不是在/Users/projects/app/tests/unit-tests/login.controller.tests.js(第71行)中的一個對象(評估'deferredLogin.resolve')
  3. TypeError:undefined不是在/Users/projects/app/tests/unit-tests/login.controller.tests.js(第79行)中的一個對象(評估'deferredLogin.reject')

這裏的控制器:

angular.module('app').controller('LoginCtrl', function($scope, $state, $ionicPopup, $auth) { 
    $scope.loginData = {}; 
    $scope.user = { 
     email: '', 
     password: '' 
    }; 

    $scope.doLogin = function(data) { 
     $auth.login(data).then(function(authenticated) { 
     $state.go('app.tabs.customer', {}, {reload: true}); 
     }, function(err) { 
     var alertPopup = $ionicPopup.alert({ 
      title: 'Login failed!', 
      template: 'Please check your credentials!' 
     }); 
     }); 
    }; 

}); 

這裏的測試:

describe('LoginCtrl', function() { 

    var controller, 
     deferredLogin, 
     $scope, 
     authMock, 
     stateMock, 
     ionicPopupMock; 

    // load the module for our app 
    beforeEach(angular.mock.module('app')); 

    // disable template caching 
    beforeEach(angular.mock.module(function($provide, $urlRouterProvider) { 
     $provide.value('$ionicTemplateCache', function(){}); 
     $urlRouterProvider.deferIntercept(); 
    })); 

    // instantiate the controller and mocks for every test 
    beforeEach(angular.mock.inject(function($controller, $q, $rootScope) { 
     deferredLogin = $q.defer(); 

    $scope = $rootScope.$new(); 

     // mock dinnerService 
     authMock = { 
      login: jasmine.createSpy('login spy') 
          .and.returnValue(deferredLogin.promise) 
     }; 

     // mock $state 
     stateMock = jasmine.createSpyObj('$state spy', ['go']); 

     // mock $ionicPopup 
     ionicPopupMock = jasmine.createSpyObj('$ionicPopup spy', ['alert']); 

     // instantiate LoginController 
     controller = $controller('LoginCtrl', { 
      '$scope': $scope, 
      '$state': stateMock, 
      '$ionicPopup': ionicPopupMock, 
         '$auth': authMock 
      }); 

    })); 

    describe('#doLogin', function() { 

     // call doLogin on the controller for every test 
     beforeEach(inject(function(_$rootScope_) { 

      $rootScope = _$rootScope_; 

      var user = { 
       email: '[email protected]', 
       password: 'test' 
      }; 

      $scope.doLogin(user); 

     })); 

     it('should call login on $auth Service', function() { 

      expect(authMock.login).toHaveBeenCalledWith(user); 
     }); 

     describe('when the login is executed,', function() { 
      it('if successful, should change state to app.tabs.customer', function() { 

       deferredLogin.resolve(); 
       $rootScope.$digest(); 

       expect(stateMock.go).toHaveBeenCalledWith('app.tabs.customer'); 
      }); 

      it('if unsuccessful, should show a popup', function() { 

       deferredLogin.reject(); 
       $rootScope.$digest(); 

       expect(ionicPopupMock.alert).toHaveBeenCalled(); 
      }); 
     }); 
    }) 
}); 

這裏是我的噶配置:

files: [ 
    '../www/lib/ionic/js/ionic.bundle.js', 
    '../www/lib/angular-mocks/angular-mocks.js', 
    '../www/js/*.js', 
    '../www/js/**/*.js', 
    'unit-tests/**/*.js' 
], 
+0

驚訝有沒有這方面的答案。任何測試專家在那裏? – user3096491

回答

1

我認爲你做檢查控制器是不確定的。嘗試先替換它,然後檢查它是否被定義。

it('controller to be defained', function() { 
      expect($controller).toBeDefined(); 
}); 

如果不是,嘗試調用控制器:

$controller = _$controller_;