如何模拟在控制器初始化时运行的函数
How to mock a function that runs on controller initialization?
>Controller:
function myCtrl($scope) {
$scope.firstFn = function() {
console.log('firstFn called');
$scope.test1 = 2;
};
$scope.secondFn = function() {
console.log('secondFn called');
$scope.test2 = 3;
};
(function constructor() {
console.log('Controller init.');
$scope.test1 = 1;
$scope.test2 = 2;
$scope.firstFn();
})();
};
是否可以在不执行"firstFn"的情况下为名为"secondFn"的函数编写单元测试?可以嘲笑它什么的吗?
scope = $rootScope.$new();
ctrl = $controller('myCtrl', {$scope: scope});
// Mock firstFn ?
scope.secondFn();
// assert $scope.test1 = 1
// assert $scope.test2 = 3
您将需要:
- 在创建控制器之前
$scope
上创建firstFn
的模拟版本 - 防止控制器更换模拟
除非你正在测试像IE8这样的旧浏览器,否则你可以通过使用Jasmine的createSpy
和ECMAScript 5方法Object.defineProperty()
来实现这一点。
请注意,以下示例使用的是 Jasmine 2.0。
创建模拟:
firstFnMock = jasmine.createSpy('firstFn').and.callFake(function() {
console.log('firstFnMock called');
});
使用 defineProperty
在名为 firstFn
$scope
上创建属性,并将其值设置为模拟函数:
Object.defineProperty($scope, "firstFn", {
enumerable: false,
configurable: false,
writable: false,
value: firstFnMock
});
请务必将writable
设置为false
,因为它将阻止控制器更换模拟。
往常一样在创建控制器时使用准备好的$scope
(在此示例中设置创建控制器的函数):
createController = function() {
return _$controller_('MyController', {
$scope: $scope
});
};
规格示例:
it('Spec', function() {
createController();
expect(firstFnMock).toHaveBeenCalled();
$scope.secondFn();
expect($scope.test1).toBe(1);
expect($scope.test2).toBe(3);
});
演示:http://plnkr.co/edit/rJuixdHx70SvMcLhGoBz?p=preview
只是监视firstFn
.默认情况下,对监视函数的任何调用都将是针对 Jasmine 间谍对象,而不是实际函数。
scope = $rootScope.$new();
ctrl = $controller('myCtrl', {$scope: scope});
spyOn(scope, 'firstFn');
scope.secondFn();
// assert $scope.test1 = 1
// assert $scope.test2 = 3
有关对间谍行为的更多控制,请参阅 http://jasmine.github.io/2.0/introduction.html#section-Spies
相关文章:
- 使用javascript函数在页面初始化后加载jquery
- 未捕获错误:无法在初始化之前调用方法;
- 如何在剑道网格初始化后设置pageSizes
- React redux初始化功能,无论状态变化如何
- 为什么可以't Protractor在自动初始化的Angular网站上查找Angular
- Node.js:如何在服务器初始化时运行一个特殊的函数
- 最后定义的原型函数始终在对象初始化时运行
- 如何模拟在控制器初始化时运行的函数
- 只有在 AngularJS 中初始化完成后才运行控制器
- AngularJS:初始化控制器时运行代码
- 由服务器初始化然后由客户端运行的时钟已延迟
- 如何使用mocha运行一些初始化代码
- AngularJS运行函数两次,尽管控制器只被初始化一次
- 在变量初始化时运行代码
- 在运行时重新初始化jCarouselLite
- 当chrome扩展加载一次时,运行一个JS方法来初始化变量
- 信号r:连接还没有完全初始化.使用.start().done()或.start().fail()在连接启动后运行逻辑
- JS初始化正确,但仍然不能运行,除非我把它放入控制台
- 窗口大小调整和初始化一起运行
- asp.net mvc 4-只有在CKEditor初始化后才能运行JavaScript函数