如何在使用AngularJS保存变量时进行单元测试?
我的控制器功能有:如何在使用AngularJS保存变量时进行单元测试?,angularjs,unit-testing,karma-runner,Angularjs,Unit Testing,Karma Runner,我的控制器功能有: $scope.openForgotPasswordModal = function() { var forgotPasswordModal; forgotPasswordModal = $modal.open({ templateUrl: '/templates/passwordReset.html', scope: $scope, size: 'lg' }); $scope.closeModal = function() {
$scope.openForgotPasswordModal = function() {
var forgotPasswordModal;
forgotPasswordModal = $modal.open({
templateUrl: '/templates/passwordReset.html',
scope: $scope,
size: 'lg'
});
$scope.closeModal = function() {
return forgotPasswordModal.close();
};
};
测试模态的开启非常简单:
it('should open a modal', function() {
$scope.init();
$scope.openForgotPasswordModal();
expect($modal.open).toHaveBeenCalledWith({
templateUrl: '/templates/passwordReset.html',
scope: $scope,
size: 'lg'
});
$scope.closeModal = function() {
forgotPasswordModal.close();
};
});
如何测试
closeModal
函数?调用$modal.open()时,我使用spyOn函数返回假对象:
然后,可以监视fakeModal.close()并知道是否调用了它:
spyOn(fakeModal, 'close').and.callThrough();
$scope.closeModal();
expect(fakeModal.close).toHaveBeenCalled();
考虑到这是一个单元测试,$modal是一个外部依赖项,测试它的正确方法是模拟$modal:
var $modalMock = jasmine.createSpyObj('$modal', ['open']),
forgotPasswordModalMock = jasmine.createSpyObj('$forgotPasswordModal', ['close']);
$modalMock.and.callFake(function(){
return forgotPasswordModalMock;
});
beforeEach(angular.mock.module(function($provide){
$provide.value('$modal', $modalMock);
}));
it('should open a modal', function() {
$scope.init();
$scope.openForgotPasswordModal();
expect($modalMock.open).toHaveBeenCalledWith({
templateUrl: '/templates/passwordReset.html',
scope: $scope,
size: 'lg'
});
});
it('should close a modal', function(){
$scope.closeModal();
expect(forgotPasswordModalMock.close).toHaveBeenCalled();
})
如果$modal被破坏,这个测试应该仍然通过,因为$modal的内部工作超出了这个特定单元测试的范围。我知道你在问单元测试,但是如果你也在做e2e测试,我发现MODALSHMM更容易-遗憾的是,还没有
e2e
设置
var $modalMock = jasmine.createSpyObj('$modal', ['open']),
forgotPasswordModalMock = jasmine.createSpyObj('$forgotPasswordModal', ['close']);
$modalMock.and.callFake(function(){
return forgotPasswordModalMock;
});
beforeEach(angular.mock.module(function($provide){
$provide.value('$modal', $modalMock);
}));
it('should open a modal', function() {
$scope.init();
$scope.openForgotPasswordModal();
expect($modalMock.open).toHaveBeenCalledWith({
templateUrl: '/templates/passwordReset.html',
scope: $scope,
size: 'lg'
});
});
it('should close a modal', function(){
$scope.closeModal();
expect(forgotPasswordModalMock.close).toHaveBeenCalled();
})