2015-05-31 63 views
1

我想測試使用控制器作爲語法的簡單窗體控制器。我想要的是能夠將不同的字段值傳遞給每個單元測試並查看控制器如何反應。我使用作爲示例的代碼:使用控制器測試變量綁定語法

控制器:

angular.module('auth').controller('LoginFormCtrl',['AuthService',function(AuthService) { 
    var self = this; 

    self.non_field_errors = {}; 

    self.login = function(){ 
    AuthService.login(self.login_details.username,self.login_details.password) 
     .then(function(){ 
      //do routing stuff here 
     },function(response){ 
      if('non_field_errors' in response){ 
       self.non_field_errors = response.non_field_errors; 
      } 
     }); 
    }; 
}]); 

測試:

describe('LoginFormCtrl', function() { 

var scope; //scope to bind controller to 
var ctrl; //Controller to be tested 

beforeEach(module('auth')); 

//Mock out AuthService 
beforeEach(module(function($provide){ 

    authService = { 
     login: function(username,password){ 
      var deferred = $q.defer(); 
      if(username == 'test1' && password == 'password1'){ 
       deferred.resolve(); 
      }else{ 
       deferred.reject({non_field_errors:['non_field_error_1']}); 
      } 
      return deferred; 
     } 
    }; 
    $provide.value('AuthService',authService); 

})); 

//Set up scope 
beforeEach(inject(function($rootScope){ 
    scope = $rootScope.$new(); 
})); 

//Set up spies 
beforeEach(inject(function(AuthService){ 
    spyOn(AuthService,'login').andCallThrough(); 
})); 

//Clean Up 
afterEach(function(){ 
    ctrl = null; 
}); 

it('should log the user in if they provide the correct details', inject(function($controller){ 

    ctrl = $controller('LoginFormCtrl',scope,{ 
     login_details:{ 
      username:'test1', 
      password:'password1', 
     } 
    }); 

    ctrl.login(); 
    expect(AuthService.login).toHaveBeenCalledWith('test1','password1'); 
})); 

});

我試過幾種不同的方法,比如創建一個範圍並直接操作ctrl變量。做這種測試的最好方法是什麼?

回答

1

開始通過實例化控制器:

ctrl = $controller('LoginFormCtrl'); 

角將注入AuthService。在控制器中沒有其他依賴項注入,因此傳遞作用域或login_details將不起作用。

然後設置其login_details:

ctrl.login_details = { 
    username: 'test1', 
    password: 'password1' 
}; 

然後調用函數來測試:

ctrl.login(); 
相關問題