Mit*_*lie 4 javascript recursion jasmine angularjs
我有一个递归方法,如果设置了标志,它将每五秒调用一次。我正在尝试编写一个测试来监视该方法,调用它,等待六秒钟,然后期望该方法被调用两次。我的测试失败了,因为间谍报告该方法仅被调用一次(初始调用)。
我正在使用Angular 风格指南,所以我将这些方法附加到this. 我怀疑从 angular-mocks 返回的控制器的范围可能存在问题$controller(),但我不确定 - 大多数人都将方法附加到$scope.
如果不将方法附加到$scope,我如何创建一个间谍来验证我的方法已被调用两次?
应用程序.js:
'use strict';
angular
.module('MyApp', [
//...
]);
angular
.module('MyApp')
.controller('MyController', MyController);
MyController.$inject = [
//...
];
function MyController() {
var vm = this;
vm.callMyself = callMyself;
vm.flag = false;
function callMyself () {
console.log('callMyself');
if (vm.flag) {
console.log('callMyself & flag');
setTimeout(vm.callMyself, 5000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
appSpec.js:
describe('MyController', function () {
var $scope;
beforeEach(function () {
module('MyApp');
});
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
controllerInstance = $controller('MyController', {$scope: $scope});
}));
it('should call itself within 6 seconds if flag is true', function (done) {
controllerInstance.flag = true;
spyOn(controllerInstance, 'callMyself');
controllerInstance.callMyself();
setTimeout(function () {
expect(controllerInstance.callMyself).toHaveBeenCalledTimes(2);
done();
}, 6000);
}, 7000);
});
Run Code Online (Sandbox Code Playgroud)
您需要使用.and.callThrough()来进一步执行会调用自身的函数:
通过将 spy 与 链接起来
and.callThrough,spy 仍将跟踪对它的所有调用,但除此之外,它还会委托给实际的实现。
spyOn(controllerInstance, 'callMyself').and.callThrough();
Run Code Online (Sandbox Code Playgroud)
在 plunker 中测试 - 它有效。
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |