gpt4 book ai didi

javascript - 使用 window.confirm 进行 Angular 指令 Controller 单元测试

转载 作者:行者123 更新时间:2023-12-03 07:50:43 25 4
gpt4 key购买 nike

我正在尝试为指令获得 100% 的测试覆盖率。该指令有一个 Controller ,其函数使用 window.confirm 方法。

'use strict';

(function() {

angular
.module('app')
.directive('buttonToggle', buttonToggle);

function buttonToggle() {
var buttonToggleController = ['$scope', function($scope) {
$scope.toggle = function() {
var confirmResponse = (window.confirm('Are you sure?') === true);

if(confirmResponse) {
$scope.on = !$scope.on;
}
return $scope.on;
};
}];

return {
restrict: 'E',
templateUrl: 'client/modules/buttonToggle/buttonToggle.html',
replace: true,
scope: {
on: '='
},
controller: buttonToggleController
};
}
})();

我已经进行了测试,以确保所有内容均已定义,但我无法在 Controller 的 $scope.toggle 方法中输入 if 语句。

describe('The buttonToggle directive', function() {

var $compile,
$scope,
btElement = '<button-toggle></button-toggle>',
compiledElement,
window,
confirm,
btElementPath = 'client/modules/buttonToggle/buttonToggle.html',
btController;

beforeEach(module('app'));
beforeEach(module(btElementPath));

beforeEach(inject(function(_$compile_, _$rootScope_, $templateCache, $window) {
$compile = _$compile_;
window = $window;
spyOn(window, 'confirm');
$scope = _$rootScope_.$new();
var template = $templateCache.get(btElementPath);
$templateCache.put(btElementPath, template);
var element = angular.element(btElement);
compiledElement = $compile(element)($scope);
$scope.$digest();
btController = element.controller('buttonToggle', {
$window: window
});
scope = element.isolateScope() || element.scope();
}));

it('should be defined', function() {
expect(compiledElement.html()).toContain('btn');
});

describe('buttonToggle controller', function() {
it('should be defined', function() {
expect(btController).not.toBeNull();
expect(btController).toBeDefined();
});

describe('toggle', function() {
it('should be defined', function() {
expect(scope.toggle).toBeDefined();
});

it('should confirm the confirmation dialog', function() {
scope.toggle();
expect(window.confirm).toHaveBeenCalled();
});
});
});
});

我猜测它与模拟 $window 服务有关,但我不确定是否能够测试它,因为它没有全局声明。那么, Controller 的功能是否完全“可单元测试”?如果没有,我应该在单独的文件中编写指令的 Controller 并使用 angular.module.controller 吗?如果是,那么我如何测试它,或者我错过了什么?

最佳答案

使用 Angular $window服务而不是直接窗口,这是您在测试中所做的事情,但不是在指令中所做的事情。

然后你可以模拟它的任何功能:

spyOn($window, 'confirm').and.returnValue(false);

关于javascript - 使用 window.confirm 进行 Angular 指令 Controller 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35003542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com