gpt4 book ai didi

javascript - "clock"指令的 Angular 单元测试 $interval

转载 作者:数据小太阳 更新时间:2023-10-29 04:45:53 28 4
gpt4 key购买 nike

我有一个 Angular 指令“时钟”,我正在尝试编写一个单元测试以查看时钟 $interval 是否真的提前到 future 时间(即:通过查看 element.text() 2 分钟).我通过了当前时间的测试,现在我想测试它是否会通过 $interval.flush 显示 future 的时间。在我看来 $interval.flush 并没有真正推进时钟。

我可以要求两个答案吗:

  • 如果 $interval 触发,我如何进行单元测试?
  • 为什么 $interval.flush 似乎没有推进 Date()

我遵循这些帖子中的指南:

相关帖子建议使用 Jasmine 模拟,我认为不再需要了。

类似的问题:

HTML

  <mydatething format="EEEE, MMMM d" interval="1000" timezone="notused"></mydatething>

指令

myApp.directive('mydatething', ['$interval', 'dateFilter', function ($interval, dateFilter) {
return {
restrict: "AE",
scope: {
format: '@',
interval: '@'
},
template: '', // the template is the Date() output
link: function (scope, element, attrs) {

// scope expects format, interval and timezone
var clockid;
var clockinterval = scope.interval;
var dateformat = scope.format;
var clocktimezone = scope.timezone;

// DOM update function
function updateClock() {
element.text(dateFilter(new Date(), dateformat));
}

// Instantiate clock
updateClock();
clockid = $interval(updateClock, clockinterval); // fixed

// For cancelling
scope.$on('$destroy', function () {
$interval.cancel(clockid);
});

// Separate listener for locale change, manually refresh clock format
scope.$on('$localeChangeSuccess', function () {
updateClock();
})
}
};
}]);

单元测试

describe("tsdate directive", function(){
var elem, scope, $interval, dateFilter;
beforeEach(module('tsApp'));
beforeEach(inject(function(_$rootScope_, _$interval_, _$compile_, _dateFilter_){
$compile = _$compile_;
dateFilter = _dateFilter_;
$interval = _$interval_;
$rootScope = _$rootScope_;
scope = $rootScope.$new();

elem = angular.element('<mydatething format="h:mm a" interval="15000"></mydatething>');
elem = $compile(elem)(scope);
scope.$digest();

}));
describe('on clock start', function() {
it('to show the current date', function() {
var currentdate = dateFilter(new Date(), elem.isolateScope().format);
expect(elem.text()).toBe(currentdate);
// this passes
});
it('that it updates the clock', function() {
var futurems = 120000; // 2 minutes
var futuredate = dateFilter(new Date().getTime() + futurems, elem.isolateScope().format)
$interval.flush(futurems);
expect(elem.text()).toBe(futuredate);
// this fails
});
});

});

终端

PhantomJS 1.9.8 (Mac OS X) mydatething directive on clock start that it updates the clock FAILED
Expected '3:55' to be '3:57'.

Console.log 显示,futuredate 变量增加了 2 分钟,但 elem.text() 保持当前时间。

最佳答案

开始前的注意事项:

您的指令代码有错误。调用 $interval 时,将函数对象作为第一个参数传递。没有括号。

// Do this
clockid = $interval(updateClock, clockinterval);

// Not this
clockid = $interval(updateClock(), clockinterval);

查看 plunker 上的差异

其次,调用 $interval.flush 会使 interval 向前移动毫秒数,但它对内部 Javascript 时钟没有影响。由于您使用 Date 来更新时钟上的时间,因此您始终获得当前时间。调用 $interval.flush 可能会导致 interval 多次更新时钟,但它始终将其设置为当前时间。

关于javascript - "clock"指令的 Angular 单元测试 $interval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997544/

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