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變量。做這種測試的最好方法是什麼?