gpt4 book ai didi

javascript - 监视递归 Angular Controller 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:10 26 4
gpt4 key购买 nike

我有一个递归方法,如果设置了标志,它将每五秒调用一次。我正在尝试编写一个监视该方法的测试,调用它,等待六秒钟,然后期望该方法被调用两次。我的测试失败了,因为 spy 报告该方法只被调用一次(初始调用)。

我正在使用 Angular style guide ,所以我将这些方法附加到 this 的占位符。我怀疑从 angular-mocks $controller() 返回的 Controller 范围可能存在问题,但我不确定——大多数人都将方法附加到 $scope.

如果不将方法附加到 $scope,我如何创建一个 spy 来验证我的方法是否已被调用两次?

应用程序.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);
}
}
}

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);
});

Working Plunker

最佳答案

您需要使用 .and.callThrough()进一步执行调用自身的函数:

By chaining the spy with and.callThrough, the spy will still track all calls to it but in addition it will delegate to the actual implementation.

spyOn(controllerInstance, 'callMyself').and.callThrough();

在 plunker 中测试 - 它有效。

关于javascript - 监视递归 Angular Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36315710/

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