Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用AngularJS保存变量时进行单元测试?_Angularjs_Unit Testing_Karma Runner - Fatal编程技术网

如何在使用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();
})